C:字符指针和数组的区别

C:字符指针和数组的区别

考虑:

char amessage[] = "now is the time";char *pmessage = "now is the time";

我从C语言,第二版,上述两项声明不做相同的事情。

我一直认为数组是操作指针来存储数据的一种方便的方法,但显然不是这样的.C中数组和指针之间的“非平凡”区别是什么?


ibeautiful
浏览 557回答 3
3回答

慕的地6264312

没错但这是个微妙的区别。基本上,前者:char amessage[] = "now is the time";定义一个数组,其成员驻留在当前作用域的堆栈空间中,而:char *pmessage = "now is the time";定义一个指针,该指针驻留在当前作用域的堆栈空间中,但它引用其他地方的内存(在这个指针中,“Now is time”存储在内存的其他地方,通常是字符串表)。另外,请注意,由于属于第二个定义(显式指针)的数据没有存储在当前作用域的堆栈空间中,因此未指定数据的确切存储位置,不应对其进行修改。编辑:正如Mark,gman和Pavel所指出的,在这些变量中使用Address-of运算符时,也存在差异。例如,&pMessage返回char*类型的指针,或chas的指针,而&amessage返回char(*)[16]类型的指针,或指向由16个字符组成的数组的指针(与char*一样,需要像litb指出的那样取消引用)。

BIG阳

下面是一个假设的内存映射,显示了这两个声明的结果:                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”存储为内存地址0x00008000处的16元素字符数组。这个内存可能是不可写的;最好假设它不是。永远不要尝试修改字符串文本的内容。宣言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;然后,它可以在任何地方使用,可以使用。

智慧大石

数组包含元素。指针指向它们。第一种是一种简短的说法。char amessage[16];amessage[0] = 'n';amessage[1] = 'o';...amessage[15] = '\0';也就是说,它是一个包含所有字符的数组。特殊的初始化为您初始化它,并自动确定它的大小。数组元素是可修改的-您可以覆盖其中的字符。第二种形式是指针,它只指向字符。它不直接存储字符。由于数组是字符串文本,所以不能将指针写入它所指向的位置。char *pmessage = "now is the time";*pmessage = 'p'; /* undefined behavior! */这段代码可能会在你的盒子上崩溃。但它可以做任何它喜欢做的事,因为它的行为是不确定的。
打开App,查看更多内容
随时随地看视频慕课网APP