C语言-数组指针

1、二维数组

二维数组,有行,有列。二维数组可以看成有多个一维数组构成的,是多个一维数组的集合,可以认为二维数组的每一个元素是个一维数组。

例:

int a[3][5];

定义了一个3行5列的一个二维数组。

可以认为二维数组a由3个一维数组构成,每个元素是一个一维数组。

回顾:

数组的名字是数组的首地址,是第0个元素的地址,是个常量,数组名字加1指向下个元素。

二维数组a中 ,a+1 指向下个元素,即下一个一维数组,即下一行。

1 #include <stdio.h>

2 int main(int argc, char *argv[])

3 {

4 int a[3][5];

5 printf("a=%p\n",a);

6 printf("a+1=%p\n",a+1);

7 return 0;

8 }

2、数组指针的概念:

本身是个指针,指向一个数组,加1跳一个数组,即指向下个数组。

数组指针的作用就是可以保存二维数组的首地址

3、数组指针的定义方法:

指向的数组的类型(*指针变量名)[指向的数组的元素个数]int (*p)[5];//定义了一个数组指针变量p,p指向的是整型的有5个元素的数组 。

p+1 往下指5个整型,跳过一个有5个整型元素的数组。

1 void test1()

2 {

3 int a[3][5];//定义了一个3行5列的一个二维数组

4 int(*p)[5];//定义一个数组指针变量p,p+1跳一个有5个元素的整型数组

5

6 printf("a=%p\n",a);//第0行的行地址

7 printf("a+1=%p\n",a+1);//第1行的行地址,a和a +1差20个字节

8

9 p=a;

10

11 printf("p=%p\n",p);

12 printf("p+1=%p\n",p+1);//p+1跳一个有5个整型元素的一维数组

13 }

数组指针的用法

1 //数组指针的用法

2 //可以将二维数组的首地址传递到另一个函数里面,此时函数的形参就需要定义为数组指针

3 void fun(int(*p)[5],int x,int y)

4 {

5 p[0][1]=101;

6 }

7

8 void test2()

9 {

10 int i,j;

11 int a[3][5] = {0};

12 fun(a,3,5);

13 for(i=0;i<3;i++)

14 {

15 for(j=0;j<5;j++)

16 {17 printf("%d ",a[i][j]);

18 }

19 printf("\n");

20 }

21 }

4、各种数组指针的定义:

(1)、一维数组指针,加1后指向下个一维数组

int(*p)[5] ;

配合每行有5个int型元素的二维数组来用

int a[3][5]

int b[4][5]

int c[5][5]

int d[6][5]

.....

p=a;

p=b;

p=c;

p=d;

都是可以的~~~~

(2)、二维数组指针,加1后指向下个二维数组

int(*p)[4][5];

配合三维数组来用,三维数组中由若干个4行5列二维数组构成

int a[3][4][5];

int b[4][4][5];

int c[5][4][5];

int d[6][4][5];

这些三维数组,有个共同的特点,都是有若干个4行5的二维数组构成。

p=a;

p=b;p=c;

p=d;

(3)、三维数组指针,加1后指向下个三维数组

int(*p)[4][5][6];

p+1跳一个三维数组;

什么样的三维数组啊?

由4个5行6列的二维数组构成的三维数组

配合:

int a[7][4][5][6];

(4)、四维数组指针,加1后指向下个四维数组,以此类推。。。。

5、容易混淆的内容:

指针数组:是个数组,有若干个相同类型的指针构成的集合

int *p[10];

数组p有10个int *类型的指针变量构成,分别是p[0] ~p[9]

数组指针:本身是个指针,指向一个数组,加1跳一个数组

int (*p)[10];

P是个指针,p是个数组指针,p加1指向下个数组,跳10个整形。

指针的指针:

int **p;//p是指针的指针

int *q;

p=&q;

6、 数组名字取地址:变成 数组指针

一维数组名字取地址,变成一维数组指针,即加1跳一个一维数组

int a[10];

a+1 跳一个整型元素,是a[1]的地址

a和a+1 相差一个元素,4个字节

&a就变成了一个一维数组指针,是 int(*p)[10]类型的。

(&a) +1 和&a相差一个数组即10个元素即40个字节。7、数组名字和指针变量的区别:

int a[10];

int *p;

p=a;

相同点:

a是数组的名字,是a[0]的地址,p=a即p也保存了a[0]的地址,即a和p都指向a[0],所

以在引用数组元素的时候,a和p等价

不同点:

1、 a是常量、p是变量

可以用等号'='给p赋值,但是不能用等号给a赋值

2、 对a取地址,和对p取地址结果不同

因为a是数组的名字,所以对a取地址结果为数组指针。

p是个指针变量,所以对p取地址(&p)结果为指针的指针。

8、多维数组中指针的转换:

在二维数组中,行地址 取 * 不是取值得意思,而是指针降级的意思,由行地址(数组指针)变成这一行第0个元素的地址。取*前后还是指向同一个地方,但是指针的类型不一样了

1 //二维数组的数组名降级问题

2 //二维数组的数组名默认是一个行指针,加1保存下一行的首地址

3 //二维数组的数据名取*,表示地址的降级,意味着行指针降级为列指针,加1保存下一个元素的地址

4

5 //一维数组的数组名默认是一个列指针,加1保存下一个元素的地址

6 //一维数组的数组名取&,则是地址的升级,将列指针升级为行指针,加1保存下一行元素的首地址

7 void test3()

8 {

9 int a[3][5];

10 printf("a=%p\n",a);11 printf("a +1=%p\n",a+1);

12

13 printf("*a =%p\n",*a);// *a变成了第0行第0列元素的地址

14 printf("(*a)+1 =%p\n",(*a)+1 ); //结果为第0行第1列元素的地址

15 }

相关推荐
刚学HTML1 小时前
leetcode 05 回文字符串
算法·leetcode
stm 学习ing2 小时前
HDLBits训练5
c语言·fpga开发·fpga·eda·hdlbits·pld·hdl语言
AC使者2 小时前
#B1630. 数字走向4
算法
冠位观测者2 小时前
【Leetcode 每日一题】2545. 根据第 K 场考试的分数排序
数据结构·算法·leetcode
古希腊掌管学习的神2 小时前
[搜广推]王树森推荐系统笔记——曝光过滤 & Bloom Filter
算法·推荐算法
qystca2 小时前
洛谷 P1706 全排列问题 C语言
算法
浊酒南街3 小时前
决策树(理论知识1)
算法·决策树·机器学习
就爱学编程3 小时前
重生之我在异世界学编程之C语言小项目:通讯录
c语言·开发语言·数据结构·算法
学术头条3 小时前
清华、智谱团队:探索 RLHF 的 scaling laws
人工智能·深度学习·算法·机器学习·语言模型·计算语言学
Schwertlilien3 小时前
图像处理-Ch4-频率域处理
算法