为什么字符串可以分配给 char * 指针,而不能分配给 char []数组?

有人能解释一下为什么这个指针能起作用吗:

char * str1;


str1 = "Hello1";


str1 = "new string";


// but not this
char str2 [] = "hello";
str2 = "four";


// or this
char str3 [];
str3 = "hello";
str3 = "hello";
112845 次浏览

数组和指针是两回事,这就是原因。 可以赋值给指针,但不能赋值给数组。对于使用字符串文字初始化 char 数组,有一个特殊的例外。

char a[] = "Hello"; //initialize a char array with string literal. Special case, OK
char* p = "Hello"; //initializa a pointer with an array(which gets converted to pointer)
p = "My";   //assign pointer to point to another value. OK
a = "My";   //error, arrays cannot be assigned to. Use `strcpy`

字符串文字(例如“ Hello”)的类型为 char[N],其中 N是字符数(包括终止的 '\0')。数组可以转换为指向其第一个元素的指针,但数组和指针不是一回事,不管一些糟糕的书或老师怎么说。

简而言之,因为数组不是 C/C + + 中的第一类物件。赋值数组的唯一方法是使用 str (n) cpy 或 memcpy。

当一个数组被传递给一个函数时,它会折叠成一个指针,除非在编译时作为初始化,否则不可能赋值给一个数组。

为什么使用指针:
当你在 C 语言中说 char * str1时,你是在内存中分配一个指针。当您编写 str1 = "Hello";时,您正在内存中创建一个字符串文字并使指针指向它。当您创建另一个字符串文字 "new string"并将其赋值给 str1时,您所做的一切就是更改指针指向的位置。

为什么它不适用于数组:
当您说 char str2 [] = "Hello"时,您正在创建一个字符串文字,并在其定义期间将其放入数组中。不给出大小是可以的,因为数组会计算它,并向它附加一个 '\0'。如果不调整数组的大小,就不能将任何内容重新分配给该数组。这就是为什么 str2 = "four"不工作。

对于 str3,情况是相同的。您还没有在定义中定义数组的大小,因此它计算出数组的大小为0。在不调整数组大小的情况下,不能分配任何新内容。

这仅仅是因为,当您编写这段代码时:

char str2 [] = "hello";

甚至:

int arr[] = {1,2,4,4,5};

它创建 str2arr作为一个常量指针。这就是为什么在以后创建普通指针时,不能为这些指针重新赋值,而可以为它赋任何值的原因。

有指针的案子 它之所以有效是因为当你像 str1="Hello"一样赋值时,你实际上是在创建一个名为 hello 的字符串,将它分配到内存的某个地方,并将字符串的第一个字符的地址赋给指针,由于指针不是常量,你可以再次赋给它不同的地址。还有一点需要注意的是,创建的字符串文本位于只读内存中。

字符数组的大小写 您可以赋予它一个字符串文字,同时初始化为该语言所支持的。不要把赋值和初始化混为一谈。赋值时,由于它是一个字符数组,因此必须逐个字符地改变值,您试图将字符串文字的第一个地址定位到数组的第一个字符(数组的名称返回数组第一个元素的地址)。这显然是不对的,因为第一个元素不是指针,它不能存储地址。