当我们把一维数组的数组名(即指向数组首元素的指针)赋值给一个指针变量时,这个指针变量就指向了这个一维数组的首元素,因此可以通过数组名或指向它的指针访问该元素。同样的,当我们把二维数组的数组名作为指针变量的初值时,这个指针变量也指向了这个二维数组的首元素(即第一行第一列的元素),可以通过数组名或指向它的指针访问该元素,而数组名本身指向的也是二维数组的首元素。这个指向二维数组首元素的指针变量称为指向二维数组的指针。
那么,对于一个M行N列的二维数组,它的数组名即代表一个指向M个一维数组的指针,这M个一维数组中每个数组都有N个元素,因此可以把二维数组看作是一个MN个元素的线性数组,那么该线性数组又可以用指针表示,即指向MN个元素的指针,这个指向M*N个元素的指针又可以表示为一个指向指针的指针,即指向指向一维数组的指针的指针,也即指向指向二维数组首元素的指针的指针,这就是指向二维数组的指针的指针。
下面通过两个示例来说明二维数组指针的使用:
示例一
假设有一个3行4列的二维数组,其元素值为:
1 2 3 4
5 6 7 8
9 10 11 12
我们可以声明一个指向该二维数组的指针,以及使用指针访问元素:
int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int (*p)[4]; // 声明一个指向含有4个元素的一维数组的指针
p = a; // 将a赋值给p,p现在指向二维数组a的首元素
printf("%d\n", a[1][2]); // 输出7
printf("%d\n", (*p)[2]); // 输出3
printf("%d\n", (*(p+1))[2]); // 输出7
在该例中,我们声明了一个名为a的3行4列的二维数组,并将其初始化。接着声明一个指向含有4个元素的一维数组的指针p,并将其赋值为a,这样p就指向了a的首元素,即a[0],这里要注意,由于a的每一行都含有4个元素,因此p需要指向含有4个元素的一维数组。接着我们使用数组名和指针来访问第二行第三列的元素,都成功输出了7。
示例二
假设有一个5行3列的二维数组,其元素为10到24之间的随机整数,我们要求该二维数组每行(即每个一维数组)的元素之和,并将结果存储到一个一维数组中,最后输出该一维数组的元素。
#include <stdio.h>
#define ROW 5
#define COL 3
int main()
{
int a[ROW][COL];
int sum[ROW] = {0};
int i, j;
int (*p)[COL];
// 生成二维随机整数数组a
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
a[i][j] = rand() % 15 + 10;
printf("%d ", a[i][j]);
}
printf("\n");
}
// 计算每行元素之和
p = a;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
sum[i] += *(*(p+i)+j);
}
}
// 输出每行元素之和
for (i = 0; i < ROW; i++)
{
printf("The sum of row %d is %d\n", i+1, sum[i]);
}
return 0;
}
在该例中,我们首先生成一个5行3列的随机整数二维数组a,接着声明一个指向该二维数组的指针p,并将其初始化为a,接着使用嵌套的for循环计算每行元素之和,并将其存储在sum数组中,最后输出每行元素之和。由于p一开始指向的是a的首元素,因此使用*(*(p+i)+j)
可以遍历该二维数组的所有元素,并计算每行元素之和。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言二维数组指针的概念及使用 - Python技术站