C语言中的指针-指向多维数组元素的指针变量-学习笔记-30

引入

前面,我们介绍了多维数组地址的概念,现在我们就学习如何用指针指向多维数组的元素。

例子

我们看一个例子:
有一个 3X4 的二维数组,要求用指向元素的指针变量输出二维数组各个元素的值。

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main (){
int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
int *pointer_a=a[0];
int i=0;
while(i<12){
printf("%d\n",*(pointer_a+i));
i++;
}
}

上面,我们让指针变量 pointer_a 指向了 a[0]的地址,然后通过不断的+1来向后移动指针,输出我们需要的内容,这种顺序输出比较简单。

如果我们需要指定输出某个元素,例如 a[i][j]的值的时候,我们可以利用这个公式:

i X m+j
i 就是目标元素的行数。
j 就是目标元素的列数。
m 是数组定义时的列数。例如上面的例子m就是4。

我们如果要直接输出 a[2][3] 这个元素,可以计算

2X4+3=11

计算出了11之后,就可以将代码改为:

1
2
3
4
5
6
#include <stdio.h>
int main (){
int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
int *pointer_a=a[0];
printf("%d\n",*(pointer_a+11));
}

这样我们就可以直接输出需要的元素了。

指向由 m 个元素组成的一维数组的指针变量

例子

输出一个二维数组的任何行列的元素。

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main(){
int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
int *pointer_a=a[0];
int i,j;
printf("请输入目标元素的行和列:\n");
scanf("%d %d",&i,&j);
printf("a[%d][%d]的值为:%d\n",i,j,*(pointer_a+(i*4+j)));
printf("a[%d][%d]的值为:%d\n",i,j,a[i][j]);
return 0;
}

上面我们根据公式计算出了 a[0][0] 和 a[i][j] 之间的距离,然后通过移动指针,将指针指向了 a[i][j] 并成功将其输出。

定义指向一维数组指针变量

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
int main(){
int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
int (*p)[4]; //这表示定义了指针变量 p,并且这个 p 指向一个包含4个数组元素的一维数组。
p=a; //将 a 的首行地址赋值给 p。
int i,j;
printf("请输入目标元素的行和列:\n");
scanf("%d %d",&i,&j);
printf("a[%d][%d]的值为:%d",i,j,*(*(p+i)+j));
//将 p 移动 i 位,*号得到行元素地址后,在将列元素移动 j 位
return 0;
}

在第四行,我们定义了一个

1
int (*p)[4];

这表示定义了指针变量 p,并且这个 p 指向一个包含4个数组元素的一维数组。

上面例子中,我们将 a 赋值给 p ,a 是二维数组首行元素地址,此时 p 就是一个二维数组了,因为 p 是一个多维数组首行元素地址,每个地址后又包含了4个元素组成的一维数组。

指针数组和普通数组的区别

上面我们引入了一个指针数组,并且使用了该数组,那么指针数组和普通数组都有什么却别呢?
定义一个普通数组:

1
a[4];

这是一个普通数组,数组名是 a ,里面包含 4 个数组元素。

定义一个指针数组:

1
(*p)[4];

首先,我们先声明 p 是一个指针变量,所以用括号将 和 p 放在了一起,如果写错就会定义成一个数组指针,例如 `p[4]`。
然后我们给这个指针变量 4 个数组元素,也就是说,这个 p 指向的变量,一定有 4 个一维数组。

p 指向的这个变量,可以是一个以为数组,也可以是多维数组

多维数组就是一开始我们使用的,将一个多维数组的行地址给了 p,此时 p 就不再是一个一维数组了,而是一个多维数组。

举个例子

1
2
3
4
5
6
7
8
#include <stdio.h>
int main(){
int a[4]={1,2,3,4};
int (*p)[4];
p=&a;
printf("%d\n",(*p)[0]);
return 0;
}

注意
上面第 5 行,不能写成 p=a,因为 p=a 是 p = &a[0],因为 a=&a[0],所以 p=&a[0],这就不对了,p=&a 是 p 等于 a 这个数组。

我们在区分一下:
p=a;
p=&a;

在前面多维数组的例子中,我们使用的是 p=a,这是为什么?
因为 p=a,在多维数组中,a=a[0]的地址,我们把 a[0] 这个数组的地址给了 p 。
同样的在下面的一维数组中,我们直接使用&a,也是把数组的地址给 p。

综上,如果使用指针变量数组,给指针变量赋值的时候,无论是一维还是多维,赋值的时候,必须是数组的地址给指针变量。

尾巴

这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。


-------------The End-------------
欢迎请我喝咖啡哦~!