这些声明之间的技术差异是什么?

时间:2011-02-11 06:51:18

标签: c arrays pointers string-literals

  char amessage[] = "now is the time"; /* an array */
  char *pmessage = "now is the time"; /* a pointer */

4 个答案:

答案 0 :(得分:4)

amessage的类型为char[16]。这是一个数组。数组的元素包含字符串文字中的16个字符。

pmessage的类型为char*。这是一个指针。它指向一个(不可修改的)数组,其中包含字符串文字中的16个字符。 (你应该避免使用char*指向一个字符串文字;这样做是邪恶的。你应该在引用字符串文字时尽可能使用const char*。)

答案 1 :(得分:0)

除了James McNellis的回答,amessage是一回事 - 堆栈中包含16个字符的数组恰好包含字符串“现在是时间”(因为它们在{{1 }} 被建造)。您可以更改其中包含的内容。

另一方面,amessage是两件事 - 一个字符串文字(存储在不可写的内存部分中)和一个指针。您无法更改字符串文字的内容,但可以更改指针指向的内容,并使其指向不同的字符串。你可以使用字符串文字作为其他指针的目标。

(在某种意义上,这并不完全正确 - pmessage也涉及字符串文字,因为它是在创建内容时复制的内容。但是你不能做任何事情 else < / em>之后使用该字符串文字。)

答案 2 :(得分:0)

如果您正在使用GCC,请启用-Wwrite-strings。固定字符串的类型为const char [length_of_string],转换为char *将引发警告[需要为const]。

第一个赋值是字符数组赋值,而第二个赋值是基于指针的赋值(并且结果字符串保存为固定字符串)

第一个赋值是可以接受的,而第二个赋值需要一个const限定符。

在第一项任务中,改变一个点是可以接受的(例如amessage [3] ='q')。在第二个赋值中,更改一个点是不可接受的(因为字符串是常量) - 你应该得到一个总线错误

答案 3 :(得分:0)

char amessage[] = "now is the time"; /* an array */
char *pmessage = "now is the time"; /* a pointer */

在C中,'='左边的东西被称为'左值'。该类型仅由'左值'定义。所以'amessage'是一个char数组。 'pmessage'是指向char的指针。

在C中,更多关于数组类型和数组之间的等价物。 'char *'访问,也不是。

声称'pmessage'是可修改的'左值' - 'amessage'不可修改。因此建议将'pmessage'声明为const,因为它实际上也不应该是可修改的。

E.g。

const char* const pmessage = "...";

在内存访问方面,'amessage'导致直接访问,而'pmessage'需要取消引用。

注意:C编译器只允许在编译时通过字符串文字初始化'char *'。

E.g。如果你有

1. {
2.     int j = 1;
3.     int *k = &j;
4.     int *i = 1;
5. }

第4行毫无意义&amp;这将是非法的。

强烈推荐Peter Van Linden的'Deep C Secrets',他有一整章关于C阵列&amp;指针。