#include <stdio.h>
#include <stdlib.h>
int main() {
int a[] = { 1, 2, 3, 4 }; // 定义一个数组
printf("%p\n", a); // 直接取到数组名,则隐式转换成指针,指向数组首元素
printf("%p\n", &a); // 还是一个指向数组首元素的指针
system("pause");
return 0;
}
虽然说两个运算得到的内容相同,但是不代表两个指针是同一个指针。因为指针不光要知道它指向那个位置,还要知道指向的位置有多大。接下来我们对两个指针进行加减整数操作,就可以知道这两个指针到底是不是等价的。
#include <stdio.h>
#include <stdlib.h>
int main() {
int a[] = { 1, 2, 3, 4 };
printf("%p\n", a); // 得到的是数组首元素的地址
printf("%p\n", a + 1); // 跳过了一个 int 元素,和第一个相差了4个字节
printf("%p\n", &a + 1); // 跳过整个数组,和第一个相差了16个字节
system("pause");
return 0;
}
我们可以看到 a 这个数组里面有四个元素,每个元素又是个 int 类型,即每个元素占据4个字节,所以整个数组就占据16(4*4)个字节。题目中的 a 是指向了 int,而 &a 则指向了 int数组,因此我们把 &a 这种形式的指针成为“数组指针”,指向了整个数组。
#include <stdio.h>
#include <stdlib.h>
int main() {
int* a = { 0 }; // 创建了只有一个元素的数组(大括号里面有几个元素,数组长度就是多少)
}
我们可以看到上述操作是创建了一个元素个数只有一个的数组,而且可以看到这是个元素值为NULL的“空指针”。
那么,数组指针的本质是指针,只不过它指向了整个数组,跟整数进行算术运算的时候是会跳过整个数组元素;而指针数组本质则是数组,只不过它里面的每个元素都是一个指针。这样一来,这两个概念很容易就搞清楚了。