所以我一直在看大学关于C ++的讲座,我学到了很多东西,但有一件事我还是听不懂:
为什么有时必须这样做?
char* test = "testing";
从我读过/看过的内容来看,我只是不明白你为什么要放*
。根据我的想法,如果你有一个地址,你只能使用*
,但也许我只是错了。
答案 0 :(得分:15)
这是char
:
char c = 't';
一次只能容纳一个 char
acter ! :)
这是一个C字符串:
char sz[] = "test";
它可以“保持”不仅仅是一个 char
。
char*
指向多个char
s序列的内存位置。
char sz[] = {'t', 'e', 's', 't', 0};
const char *psz = "test";
注意:
*psz == 't';
*(psz + 1) == 'e';
*(psz + 2) == 's';
*(psz + 3) == 't';
*(psz + 4) == 0; // NUL
和
sz[0] == 't';
sz[1] == 'e';
sz[2] == 's';
sz[3] == 't';
sz[4] == 0; // NUL
答案 1 :(得分:4)
char类型只能表示单个字符。如果有一系列字符,它们将在内存中彼此相邻堆叠,并返回该序列中第一个字符的位置(分配给测试)。测试只不过是指向“测试”中第一个字符的内存位置的指针,说它指向的类型是一个字符。
答案 2 :(得分:3)
你可以做以下两件事之一:
char *test = "testing";
或:
char test[] = "testing";
或者,这些主题的一些变体如:
char const *test = "testing";
我提到这个主要是因为它是你通常真正想要的那个。
然而,底线是char x;
只会定义一个字符。如果你想要一个字符串,你必须定义一个char数组或一个指向char的指针(你将用字符串文字初始化,如上所述,通常是这样)。
但前两个选项之间存在实际差异。 char *test=...
定义了一个名为test
的指针,该指针初始化为指向字符串文字。字符串文字本身是静态分配的(通常与程序的代码一起),你不应该(试图)修改它 - 因此偏好char const *
。
char test[] = ..
分配一个数组。如果它是全局的,它与前面的非常相似,只是它不为指向字符串文字的指针分配一个单独的空间 - 相反,test
成为附加到字符串的名称文字本身。
如果您将此作为局部变量执行,test
仍将直接引用字符串文字 - 但由于它是一个局部变量,它会分配“自动”存储(通常在堆栈上),它会被初始化(通常来自正常的,静态分配的字符串文字),它定义在块/范围的每个条目上。
后面的版本(带有char数组)可以看似与指针类似,因为只要将数组传递给函数,数组的名称就会衰减到数组开头的地址。但是存在差异。您可以修改数组,但修改字符串文字会产生未定义的行为。相反,您可以将指针更改为指向其他char
s,如下所示:
char *test = "testing";
if (whatever)
test = "not testing any more";
...非常好,但尝试对数组做同样的操作是不行的(数组不可分配)。
答案 3 :(得分:1)
使用*表示此变量指向内存中的某个位置。在这种情况下,它指向字符串“testing”的位置。使用char指针,您不仅限于单个字符,因为现在您有更多可用空间。
答案 4 :(得分:0)
char*
表示char
的连续内存块开头的地址。你需要它,因为你没有使用一个char
变量来处理整个char
的
访问此功能时,函数将获取第一个char
的地址并逐步通过内存。这是可能的,因为数组使用连续的内存(即所有内存在内存中都是连续的)。
希望这可以解决问题! :)
答案 5 :(得分:0)
人们忘记提到的主要问题是"testing"
是内存中的字符数组,c ++中没有原始字符串类型。因此,与任何其他数组一样,您不能将其称为元素。
答案 6 :(得分:-3)
在C中,数组由指向其中第一个元素的指针表示。