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

c中的数组名到底是什么?

c中的数组名到底是什么?

C
幕布斯6054654 2019-08-03 14:03:39
c中的数组名到底是什么?在C中,我很难理解数组名称的类型和用法,这似乎是一篇很长的文章,但请耐心等待。据我所知,以下声明a类型int []I.整数数组.int a[30];当a还指出数组的第一个元素,以及类似*(a+2)都是有效的。因此,a看上去像指向整数的指针..但实际上int []和int*是不同的,而前者是数组类型后来是指向整数的指针.也是一个类型的变量int []获取转换为类型的变量。int*传递给函数时;如C数组通过引用传递(除sizeof(操作员)这是一个让我垂头丧气的问题。请看下面的代码:int main(){     int (*p)[3];     int a[3] = { 5, 4, 6 };     p = &a;     printf("a:%d\t&a:%d\n",a,&a);     printf("%d",*(*p + 2));}产出:a:2686720       &a:26867206那么,上面的代码是如何工作的呢?我有两个问题:a和&a有同样的价值。为什么?究竟是什么int (*p)[3];做?它宣布指向数组的指针我知道这个。但是如何是一个指向数组的指针不同于指向数组的第一个元素的指针。和数组的名称?有人能把事情弄清楚吗?我有很多困惑。我知道我应该用%p作为占位符,而不是使用%d用于打印指针变量的值。由于使用整数占位符,可能会打印截断地址。但我只想保持简单。
查看完整描述

3 回答

?
慕尼黑的夜晚无繁华

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

  1. A和&a的价值是一样的,怎么回事?

它们的价值相同,但类型不同。数组对象在元素之间没有填充(前后),因此数组的地址和数组的第一个元素的地址是相同的。

即:

(void *) a == (void *) &a
  1. 它到底做了什么int(*p)[3];定义指向数组的指针,我知道,但是,指向数组的指针与指向数组的第一个元素的指针和数组的名称有什么不同呢?

这是两种不同的指针类型。例如,指针算法:

a + 1   /* address of the second element of the array */&a + 1  /* address one past the last element of the array */

编辑:由于普遍的需求,我在下面添加了一些关于数组转换的信息。

除三个例外情况外,在表达式中,类型为T被转换为类型指针的值。T指向数组的第一个元素。如果对象是sizeof&如果对象是字符串,则初始化数组。

例如,这一声明:

printf("a:%d\t&a:%d\n", a, &a);

实际上相当于:

printf("a:%d\t&a:%d\n", &a[0], &a);

还请注意d转换说明符只能用于打印有符号整数;要打印指针值,必须使用p说明符(参数必须是void *)。因此,要正确地做事情,请使用:

printf("a:%p\t&a:%p\n", (void *) a, (void *) &a);

分别:

printf("a:%p\t&a:%p\n", (void *) &a[0], (void *) &a);




查看完整回答
反对 回复 2019-08-04
?
GCT1015

TA贡献1827条经验 获得超4个赞

其他答案已经解释了这个问题。我正试着用一些图表来解释它。希望这会有帮助。


当您声明一个数组时

int a[3] = {5, 4, 6}

内存安排看上去就像

https://img1.sycdn.imooc.com//5d27e9da00019ee805260097.jpg

现在回答你的问题:

  1. a

    &a

    有同样的价值。怎么回事?

你已经知道a的数组类型和数组名称。a成为指向数组的第一个元素的指针。a(衰变后),即指向地址0x100..请注意0x100也是内存块的起始地址(数组)。a)。你应该知道,一般来说,第一个字节的地址称为变量的地址。..也就是说,如果一个变量是100个字节,那么它的地址等于它的第一个字节的地址。

&a是整个内存块的地址,即它是数组的地址。a..见图表:

https://img1.sycdn.imooc.com//5d27e9dd000115f105300240.jpg

现在你可以理解为什么a&a虽然两者的类型不同,但两者的地址值是相同的。

它到底是做什么的int (*p)[3];声明一个指向数组的指针,我知道这一点。但是,指向数组的指针与指向数组的第一个元素的指针和数组的名称有什么不同呢?

参见上面的图,我们清楚地解释了指向数组的指针与指向数组元素的指针是如何不同的。
当你分配&ap,然后p指向具有起始地址的整个数组。0x100.


注:关于这条线

..如C数组由引用传递(除sizeof职能)。

在C中,参数是通过值传递的。在C中不通过引用传递,当一个普通变量被传递给一个函数时,它的值是复制对相应参数的任何更改都不会影响变量。
数组也是通过值传递的,但不同的是,数组名称会衰减到指向第一个元素的指针,而分配给函数的参数(此处,指针值被复制)的指针;数组本身不会被复制。
与普通变量不同,用作参数的数组不受任何更改的保护,因为数组本身没有复制。,而是将指针复制到第一个元素。

你也应该注意到sizeof不是函数,在这种情况下,数组名称不充当参数。sizeof操作者数组名作为操作数..当数组名称是一元的操作数时,也是正确的。&接线员。




查看完整回答
反对 回复 2019-08-04
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

  1. a对应于指向数组第0元素的指针。然而,&.的情况也是如此,它只是给出了数组的起始地址。

作为,a   --> pointer pointing to starting element of array a[],it does not know about other element's location..

&a  --->address location for storing array a[] which stores first element location,but knows every element's location.

类似地,其他元素的位置将是(a+2),(a+4),直到数组的末尾。

因此,你得到了这样的结果。

  1. int(*p)[3]是指向数组的指针。如果是int*p[3],其含义将完全不同。这将意味着一系列的指针,这将是完全不同的上下文。

指向数组的指针将自动处理数组中的所有其他元素。

然而,指向数组的第一个元素的指针,即a只知道数组的第一个元素,您必须手动给指针算术方向来访问下一个元素。参见,在本例中-我们可以通过将2添加到a,即将第三个元素添加到a,即a+4,以此类推,从a获得第二个元素。/注意两者的区别,因为它是一个整数数组!



查看完整回答
反对 回复 2019-08-04
  • 3 回答
  • 0 关注
  • 324 浏览

添加回答

举报

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