数组和指针是两种不同的数据类型,数组是一种构造类型,用于存储一组相同类型的变量;而指针是一种特殊类型,专门用来存放数据的地址。数组名除了sizeof(数组名)和&数组名表示整个数组外,其他情况下都表示的是首元素的地址,详情见:
C语言学习笔记之数组篇-CSDN博客
因此数组也可以向指针一样通过 +整数并解引用的操作访问数组的元素,如:
#include <stdio.h>
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
printf("%d ", *(arr + i)); //*(arr + i)等价于arr[i]
}
printf("\n");
return 0;
}
同理,指针也可以像数组一样通过下标访问 代替 +/-整数并解引用的操作,如:
#include <stdio.h>
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int* parr = arr;
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
printf("%d ", parr[i]); //parr[i] 等价于 *(parr + i)
}
printf("\n");
return 0;
}
#include <stdio.h>
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
int* parr = &arr[sz - 1];
for (i = 0; i < sz; i++)
{
printf("%d ", parr[-i]); //parr[-i] 等价于 *(parr - i)
}
printf("\n");
return 0;
}
由此,我们可以得出一个结论,地址[i] == *(地址 + i),即它们的底层实现可能是一样的。数组和指针的联系仅此而已。