题目:声明一个二维 int 型数组 a,再声明另一个一维数组指针数组 b,使该数组 b 的每一个指针分别指向二维数组 a 中的每一个元素(即每一个一维数组),然后利用数组 b 计算数组 a 的和。
图解:画图帮助理解
我们要清楚什么是指针数组和数组指针,我们先要有知识储备才能完美的做好这道题目.
//定义一个指针数组
int *p[3];
指针数组:数组的元素是一个个指针,[]的元素优先级高于*;指针数组跟其他的普通数组的区别在于数组的元素不一样。
//定义一个数组指针
int (*p)[3];
一维数组指针:指一个指针指向int [3]型的数组,跟普通指针没有区别。就是指向类型不一样.
一维数组指针数组 b是什么呢?
在之前的笔记中,我们知道这是一个数组。那么数组的元素类型和变量类型的确定(之前的笔记),比如数组的元素就是把数组名+[]拿走,剩下的就是数组的元素类型。
那么该数组b的元素类型是数组指针,我们知道数组指针是指向数组的指针,所以这种复杂的类型就是:一个数组中存放着数组指针,数组的元素是数组指针。数据里面的指针指向一维数组。
代码:
#include <stdio.h>
// 数组指针数组
int main(void)
{
int a[2][3] = {1, 2, 3, 4, 5, 6}, sum = 0; // 定义一个二维数组 该二维数组有两个元素
// 数组指针数组b int (*)[] 数组指针类型
int(*b[2])[3];
b[0] = a;
b[1] = a + 1; // 直接b[1]当作指针来用 a+1表示二维数组的第二个元素
printf("%d\n", *(*(b[0] + 0))); // 数组指针类型的指向 1
printf("%d\n", *(*(b[0] + 0) + 1)); // 数组指针类型的指向 2 b[0][0][1]
printf("%d\n", b[0][0][1]);
printf("%p\n", b[0] + 1); // +1是以类型的字节为单位进行偏移
printf("%p\n", b[1]);
// 第一种方式:
for (int i = 0; i < 6; i++)
{
sum += (*(*(b[0] + 0) + i)); // 等价于sum += b[0][0][i];
}
printf("第一种方式:%d\n", sum);
// 第二种方式
for (int i = 0; i < 2; i++)
{
for (int n = 0; n < 3; n++)
{
sum += b[i][0][n]; //等价于 *(*(b[i]+0)+i)
}
}
printf("第二种方式:%d\n", sum);
return 0;
}