首先来看一段程序:
#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4};
int *p = arr;
printf("%d\n",arr[2]);
printf("%d\n",*(arr + 2));
printf("%d\n",p[2]);
printf("%d\n",*(p + 2));
return 0;
}
运行结果为:
可以看到结果相同,我们可以理解为arr[i] == *(arr + i)==p[i]==*(p + i)
为什么会出现这种情况呢?
在C语言中,数组名代表的是数组中首元素的地址,即在此时数组名是指向首元素的指针(地址)
在程序编译时,arr[i] 是按照 *(arr + i)处理的,即按照数组元素的首地址加上相应位移量找到新元素的地址,然后解引用,便
得到此处的值。(指针的算术计算可参考我的C语言指针算术运算)
那指针和数组名有什么区别用法呢?
数组名指向首元素地址,但指针可以不指向首元素地址,于是就出现下面的应用
#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4};
int *p = &arr[1];
printf("%d\n",*p);
printf("%d\n",*(p+1));
printf("%d\n",p[-1]);
return 0;
}
结果为:
此时,数组与指针关系已经清楚,但是数组名一定代表的是首元素地址吗?
答案是不一定
数组名在下列两种情况下表示整个数组:
1.在定义数组的同一个函数中,求sizeof
2.在定义数组的同一个函数中,&arr+1
看下面源代码:
#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4};
printf("%d\n",sizeof(arr));
printf("%d,%d\n",&arr,&arr+1);
return 0;
}
运行结果: