char amessage[] = "now is the time"; /* an array */
char *pmessage = "now is the time"; /* a pointer */
答案 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;指针。