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 }

相关推荐
爱装代码的小瓶子1 小时前
数据结构之队列(C语言)
c语言·开发语言·数据结构
爱喝矿泉水的猛男2 小时前
非定长滑动窗口(持续更新)
算法·leetcode·职场和发展
YuTaoShao2 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
YouQian7723 小时前
Traffic Lights set的使用
算法
快乐飒男3 小时前
哈希表(c语言)
c语言·哈希算法·散列表
go54631584654 小时前
基于深度学习的食管癌右喉返神经旁淋巴结预测系统研究
图像处理·人工智能·深度学习·神经网络·算法
aramae4 小时前
大话数据结构之<队列>
c语言·开发语言·数据结构·算法
大锦终4 小时前
【算法】前缀和经典例题
算法·leetcode
想变成树袋熊5 小时前
【自用】NLP算法面经(6)
人工智能·算法·自然语言处理
cccc来财5 小时前
Java实现大根堆与小根堆详解
数据结构·算法·leetcode