【问题标题】:Is there any difference between address of array and array itself? [duplicate]数组的地址和数组本身有什么区别吗? [复制]
【发布时间】:2015-07-02 11:05:56
【问题描述】:

下面的代码sn-p证明两者是一样的:

int a[4];
printf("a: %p\n&a: %p", a, &a);
"0x12345678"
"0x12345678"

但编译器会在以下情况下发出警告:

int a[4], *p;
p = &a; 

来自不兼容指针类型的赋值

&a 有哪些指针类型?

【问题讨论】:

  • @hacks 先生,在这个特定的问题中,将参数转换为 void * 是必需的部分。我想请您重新考虑将其标记为欺骗。谢谢你。 :-)
  • @SouravGhosh;再次检查:)
  • @hacks 感谢您的编辑,但这也不会使我之前的评论无效。 :-)

标签: c arrays pointers memory-address


【解决方案1】:

为了正确,首先,你的打印语句应该是这样的

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

因为%p 需要void * 参数。请注意,printf() being a variadic function, implicit conversion (cast) won't take place,所以需要强制转换。

现在,也就是说,a 是一个数组,

  • aint [4] 类型
  • &a 是如果类型 int (*)[4]

(但是,两者都将返回相同的地址,FWIW。)您也可以see this answer

OTOH,就您而言,p 的类型为 int *

这就是为什么你的编译器会警告你赋值中的类型不匹配。

【讨论】:

  • @Quentin 遗憾的是,在这种情况下,骗子不会解决printf() 中所需的铸造部分。
  • &a[0] a&a 都有相同的地址但类型不同
  • @Gopi a 衰减后与&a[0] 相同。
  • p=&a 发出警告(但有效)。为什么抛出p=a 不是警告,因为int * 不是int [4]int (*)[4] 类似于指针类型的指针吗?
  • @mr.wolle 我已经用链接更新了我的答案,请检查。 :-)
猜你喜欢
  • 2013-09-22
  • 2016-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 2023-03-29
  • 2016-06-19
  • 2012-09-14
相关资源
最近更新 更多