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

时间:2011-07-23 21:22:01

标签: c string pointers initialization reusability

有人可以解释为什么这适用于指针:

char * str1;

str1 = "Hello1";

str1 = "new string";

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

// or this
char str3 [];
str3 = "hello";
str3 = "hello";

5 个答案:

答案 0 :(得分:77)

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

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

如果是str3,则情况相同。您尚未在定义中定义数组的大小,因此它将其大小计算为0.如果不调整数组大小,则无法分配任何新内容。

答案 1 :(得分:19)

数组和指针是不同的东西,这就是原因。 您可以指定指针,但不能指定给数组。使用字符串文字初始化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')。数组可以转换为指向其第一个元素的指针,但数组和指针不是一回事,无论一些坏书或教师可能会说。

答案 2 :(得分:7)

简单地说,因为数组不是C / C ++中的第一类对象。分配给数组的唯一方法是使用str(n)cpy或memcpy。

当一个数组在传递给函数时折叠成指针时,除了在编译时初始化之外,不能分配给数组。

答案 3 :(得分:3)

这只是因为,当你编写这段代码时:

char str2 [] = "hello";

甚至:

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

它创建str2arr作为常量指针。这就是为什么你不能将任何其他值重新分配给这些指针的原因,而在以后的情况下你要创建一个普通指针,你可以为它指定任何东西。

答案 4 :(得分:3)

指针的情况 它的工作原理是因为当您分配像str1="Hello"时,实际上是在创建一个名为hello的字符串文字,将其分配到内存中的某个位置,并将该文字的第一个字符的地址分配给指针,并且指针不是常数,您可以使用不同的地址再次分配它。还有一点需要注意的是,创建的字符串文字是在只读内存中。

字符数组的情况 您可以在初始化时为其指定字符串文字,因为语言支持该字符串。并且不要将赋值与初始化混淆。在赋值时,由于它是一个字符数组,你必须逐个字符地改变值,你试图将字符串文字的第一个地址写入数组的第一个字符(数组的名称返回第一个元素的地址)这显然是不正确的,因为第一个元素不是指针,它不能存储地址。