为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
ibeautiful 2019-06-13 17:32:08
C:字符指针和数组的区别考虑:char amessage[] = "now is the time";char *pmessage = "now is the time";我从C语言,第二版,上述两项声明不做相同的事情。我一直认为数组是操作指针来存储数据的一种方便的方法,但显然不是这样的.C中数组和指针之间的“非平凡”区别是什么?
查看完整描述

3 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

没错但这是个微妙的区别。基本上,前者:

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指出的那样取消引用)。


查看完整回答
反对 回复 2019-06-13
?
BIG阳

TA贡献1859条经验 获得超6个赞

下面是一个假设的内存映射,显示了这两个声明的结果:

                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;

然后,它可以在任何地方使用,可以使用。


查看完整回答
反对 回复 2019-06-13
?
智慧大石

TA贡献1946条经验 获得超3个赞

数组包含元素。指针指向它们。

第一种是一种简短的说法。

char amessage[16];amessage[0] = 'n';amessage[1] = 'o';...amessage[15] = '\0';

也就是说,它是一个包含所有字符的数组。特殊的初始化为您初始化它,并自动确定它的大小。数组元素是可修改的-您可以覆盖其中的字符。

第二种形式是指针,它只指向字符。它不直接存储字符。由于数组是字符串文本,所以不能将指针写入它所指向的位置。

char *pmessage = "now is the time";*pmessage = 'p'; /* undefined behavior! */

这段代码可能会在你的盒子上崩溃。但它可以做任何它喜欢做的事,因为它的行为是不确定的。


查看完整回答
反对 回复 2019-06-13
  • 3 回答
  • 0 关注
  • 556 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信