指针数组 : 是一个数组,其中每一个元素是指针。
int a1 = 10, a2 = 20;
//定义一个指针数组
int *arr[2] = {0};
//它的元素arr[0],arr[1]就是一个指针,可以指向整型变量
arr[0] = &a1;
arr[1] = &a2;
//可以直接打印出它指向位置的值
printf("*arr[0] = %d\n", *arr[0]);
printf("*arr[1] = %d\n", *arr[1]);
便于理解写一个普通指针作对比
int b1 = 15, b2 = 25;
int *p1 = NULL;
int *p2 = NULL;
p1 = &b1;
p2 = &b2;
printf("*p1 = %d\n", *p1);
printf("*p2 = %d\n", *p2);
arr[0],arr[1] 与p1,p2就是等价的。
他们的唯一区别是arr[0]与arr[1]的地址一定是连续的,而p1,p2的地址不一定连续。
数组指针:是一个指针,指向了一个由m个元素组成的数组。
//定义一个数组指针
int (*p)[4] = NULL;
int arr[4] = {1,2,3,4};
//指向一个由四个元素组成的数组
p = &arr;
printf("(*p)[0] = %d\n", (*p)[0]);
printf("(*p)[1] = %d\n", (*p)[1]);
printf("(*p)[2] = %d\n", (*p)[2]);
printf("(*p)[3] = %d\n", (*p)[3]);
指针的类型决定了指针一次偏移多少个字节,int型指针一次偏移4个字节,而一个int型数组指针一次偏移量就是4*元素个数。
对上述程序作修改
//定义一个数组指针
int (*p)[4] = NULL;
int arr[2][4] = {1,2,3,4,5,6,7,8};
//指向由2个4个元素组成的数组
p = arr;
printf("(*p)[0] = %d\n", (*p)[0]);
printf("(*p)[1] = %d\n", (*p)[1]);
printf("(*p)[2] = %d\n", (*p)[2]);
printf("(*p)[3] = %d\n", (*p)[3]);
printf("p = %p\n", p);
p++;
printf("(*p)[0] = %d\n", (*p)[0]);
printf("(*p)[1] = %d\n", (*p)[1]);
printf("(*p)[2] = %d\n", (*p)[2]);
printf("(*p)[3] = %d\n", (*p)[3]);
printf("p = %p\n", p);
通过打印信息我们可以看到,p一次的偏移量就是4*4=16个字节
(*p)[0] = 1
(*p)[1] = 2
(*p)[2] = 3
(*p)[3] = 4
p = 0x7ffd9e74c550
(*p)[0] = 5
(*p)[1] = 6
(*p)[2] = 7
(*p)[3] = 8
p = 0x7ffd9e74c560