&数组名a,是整个数组地址,而数组名a是首元素地址。两者不同体现在哪里?可否举个例子?

![img](https://img-mid.csdnimg.cn/release/static/i

img


mage/mid/ask/091238953766166.jpg "#left")
&数组名,这个是整个数组地址。数组名是首元素地址。书上说不能加&,但是我加了也可以,虽然结果都一样,但是对两个进行加一后发现又会不一样

  1. &a是整个数组,如果加1,就是偏移整个数组地址空间;a是元素首地址,如果加1,只偏移一个元素的空间。
  2. 在多维数组中,就会体现的淋漓尽致。
  3. 参考如下代码和运行:
 
#include <stdio.h>

int main()
{
int a[] = {3,4};
printf("a=%p\n",a);  //打印a地址
printf("&a=%p\n",&a);  //打印&a地址

long b = a+1;
printf("b=%p\n",b);

long c = (&a)+1;
printf("c=%p\n",c);

return 0;
}

运行结果:

a=0x7ffee51ea8c0
&a=0x7ffee51ea8c0
b=0x7ffee51ea8c4 //b只偏移一个元素地址空间
c=0x7ffee51ea8c8 //c偏移了整个数组地址空间

虽然两者的地址值是一样的,都指向同一个地址
但数组名a相当于指针,而&a相当于指针的指针,类型是不同的。
举个比较容易看到区别的例子
比如
char s[100];
char **p = &s;
这里s和p实际的值是一样的。
但如果你用s++和p++之后,再观察s和p的值,就完全不一样了