1 指针数组 ——是数组,数组中的每个元素是指针
#include <stdio.h>
int main()
{
int a=1, b = 2, c= 3;
int *pa[3] = {&a, &b, &c};
printf("%d,%d,%d \n",*pa[0], *pa[1], *pa[2]); //1,2,3
// 二级指针指向指针数组
int **pp = pa;
printf("%d,%d,%d",**pp, **(pp+1),**(pp+2)); // 1,2,3
return 0;
}
pa数组名,pa[0] pa[1] pa[2] 是数组中的元素,因为数组中的元素也是指针类型,所以需要添加‘*’来获得实际的变量值。
2 数组指针 ——是指针, 该指针指向元素的类型是数组。
#include <stdio.h>
int main()
{
// [一维数组]
int arr[3] = {111,222,333} ;
int (*p)[3] = &arr; //p 代表数组的地址; *p代表首元素的地址
printf("%d-%d-%d\n",**p,*(*p+1), *(*p+2)); // 111-222-333
// [二维数组] 使用二级指针 指向数组指针
int arr2[2][3] = {{111,222,333},{444,555,666}};
int (*pp)[3] = arr2;
printf("%d-%d-%d\n",**pp,*(*pp+1), *(*pp+2)); // 111-222-333
printf("%d-%d-%d\n",**(pp+1),*(*(pp+1)+1), *(*(pp+1)+2)); // 444-555-666
// *(pp+1) = p[1]
printf("%d-%d-%d\n",*(pp[1]+0),*(pp[1]+1), *(pp[1]+2)); // 444-555-666
return 0;
}
找规律,方便记忆:
int arr[3] = {111,222,333} ;
int arr2[2][3] = {{111,222,333},{444,555,666}};
一维数组和二维在定义 数组指针时,没有任何区别;
二维数组在访问第1个元素(第1个一维数组中的各个元素)和访问一维数组时没有任何区别;
二维数组在访问第2个元素(第2个一维数组中的各个元素),只要将pp = pp+1 做同等替换即可,以此类推!
3 练习:三维数组的访问
--按第一维度拆分,将三维数组拆分中若干二维数组处理。
#include <stdio.h>
int main()
{
int a[][2][3] = {
{
{11,22,33},
{44,55,66}
},
{
{111,222,333},
{444,555,666}
},
};
int (*pa)[2][3] = a;
//int len = sizeof(a) / (sizeof(int)*2*3); // 第一维度的大小 dim可通过该方法获得
//printf(" dim=%d \n", len);
// a 可分为2个 二维数组, 按照普通的二维数组指针进行处理
int(*pa1)[3] = pa[0];
int(*pa2)[3] = pa[1];
printf("%d-%d-%d \n", **pa1,*(*pa1+1),*(*pa1+2)); // 11-22-33
printf("%d-%d-%d \n", **(pa1+1),*(*(pa1+1)+1),*(*(pa1+1)+2)); // 44-55-66
printf("%d-%d-%d \n", **pa2,*(*pa2+1),*(*pa2+2)); // 111-222-333
printf("%d-%d-%d \n", **(pa2+1),*(*(pa2+1)+1),*(*(pa2+1)+2)); // 444-555-666
return 0;
}