为什么string可以分配给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";
为什么它使用指针:
当你在C中说char * str1
时,你正在内存中分配一个指针。 当你写str1 = "Hello";
,你正在内存中创build一个string字面值,并使指针指向它。 当你创build另一个string文字"new string"
并将其分配给str1
,你所做的只是改变指针指向的地方。
为什么它不适用于数组:
当你说char str2 [] = "Hello"
,你正在创build一个string文字,并在定义时将其放入数组中。 数组计算并附加'\0'
即可。 您不能重新分配任何内容,而不调整其大小。 这就是为什么str2 = "four"
不会工作。
在str3
情况下,情况也是如此。 您尚未在定义中定义数组的大小,因此计算其大小为0.如果不调整数组大小,则不能指定任何新值。
数组和指针是不同的东西,这就是为什么。 您可以分配给一个指针,但不能分配给一个数组。 用string文字初始化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`
string文字(例如“Hello”)的types是char[N]
,其中N
是字符数(包括终止的'\0'
)。 一个数组可以被转换成一个指向它的第一个元素的指针,但是数组和指针并不是一回事,不pipe一些不好的书或老师可能会说什么。
简而言之,因为数组不是C / C ++中的头等对象。 分配给数组的唯一方法是使用str(n)cpy或memcpy。
当一个数组传递给一个函数时,它会折叠成一个指针,除了在编译时作为初始化之外,不可能将其分配给一个数组。
这只是因为,当你写这个代码:
char str2 [] = "hello";
甚至:
int arr[] = {1,2,4,4,5};
它创buildstr2
或arr
作为常量指针。 这就是为什么你不能重新分配这些指针的任何其他值,而在以后的情况下,你正在创build一个正常的指针,你可以分配任何东西给它。
指针的情况它的工作原理是当你像str1="Hello"
那样分配的时候,你实际上正在创build一个名为hello的string字面值,并将它分配给内存中的某个地方,并将该字面值的第一个字符的地址赋值给指针,指针不是固定的,你可以用不同的地址重新分配。 还有一点要注意的是,所创build的string文字是在只读存储器中。
字符数组的情况您可以在初始化时为其分配一个string,因为该语言支持该string。 不要将任务与初始化混淆。 赋值时,由于它的字符数组必须逐个字符地改变值,所以你试图将string的第一个地址定位到数组的第一个字符处(数组的名字返回第一个元素的地址数组)。这显然是不正确的,因为第一个元素不是指针,它不能存储地址。