考虑:char amessage[] = \'now is the time\';char *pmessage = \'now is the time\';我从《C 编程语言》第 2 版中读到,上述两个语句并不执行相同的操作。我总是……
考虑:
char amessage[] = "now is the time";
char *pmessage = "now is the time";
我从 《C 编程语言 》第 2 版中了解到,上述两个语句的作用并不相同。
我一直认为数组是一种操作指针来存储某些数据的便捷方式,但显然事实并非如此......C 语言中数组和指针之间有哪些“非平凡”的区别?
这是一个假设的内存映射,显示了两个声明的结果:
0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
0x00008000: 'n' 'o' 'w' ' ' 'i' 's' ' ' 't'
0x00008008: 'h' 'e' ' ' 't' 'i' 'm' 'e' '\0'
...
amessage:
0x00500000: 'n' 'o' 'w' ' ' 'i' 's' ' ' 't'
0x00500008: 'h' 'e' ' ' 't' 'i' 'm' 'e' '\0'
pmessage:
0x00500010: 0x00 0x00 0x80 0x00
字符串文字“now is the time”作为 16 元素的 char 数组存储在内存地址 0x00008000 处。此内存可能不可写;最好假设它不可写。您永远不应尝试修改字符串文字的内容。
宣言
char amessage[] = "now is the time";
在内存地址 0x00500000 处分配一个 16 元素的 char 数组,并将 字符串文字的 内容 随心所欲地 消息
strcpy(amessage, "the time is now");
宣言
char *pmessage = "now is the time";
在内存地址 0x00500010 处分配一个指向 char 的指针,并将 字符串文字的 地址
由于 pmessage 指向字符串文字,因此不应将其用作需要修改字符串内容的函数的参数:
strcpy(amessage, pmessage); /* OKAY */
strcpy(pmessage, amessage); /* NOT OKAY */
strtok(amessage, " "); /* OKAY */
strtok(pmessage, " "); /* NOT OKAY */
scanf("%15s", amessage); /* OKAY */
scanf("%15s", pmessage); /* NOT OKAY */
等等。如果您将 pmessage 为指向 amessage :
pmessage = amessage;
那么它就可以在任何 可以使用 消息的