c语言 二维指针解引,二维数组(解引用、指针数组、数组的指针)

二维数组

在说二维数组前先来说下一维数组中的指针数组和和数组的指针

一、一维数组中指针数组和数组指针的区别

指针数组:

1 int *p[5];

[]的优先级比*高,首先它是一个数组,它的大小是5,它里面存放的数据类型是int *,也就是整型指针。 所以它叫指针数组,讲到底这个p是一个数组,数组内的元素是5个指针,而数组内的每一个指针指向一个int型的变量

数组的指针:

int (*p)[5];

首先p是一个指针,指向大小为5的数组,因此这叫数组的指针,定义了一个指向5个元素的一维数组的指针。(括号优先)

二、两者在赋值时的区别

指针数组的赋值

1 #include

2

3 main()

4 {

5 int *p[5];

6 int a = 10;

7

8 p[0] = &a;

9 printf("%d", *p[0]);

10 }

数组的指针的赋值

1 main()

2 {

3 int (*p)[5];

4 int a[5] = {1, 2, 3, 4, 5};

5

6 p = &a;

7 printf("%d", *p[0]);

8 }

三、关于数组的地址(这里只讨论一维\二维数组)

一维数组

1 int a[5];

a表示的是数组的首地址,a等价于&a[0]

二维数组

1 int a[2][2] = {1, 2, 3, 4};

a表示的整个数组的首地址,a[0]表示的是第一行的首地址,&a[0][0]表示第一个元素的地址,这三者在数值上是一样的,但含义不同(或者说类型不同),数组名a是对于整个数组而言的,a[0]是对于第一行而言,而&a[0][0]是针对具体的第一个元素

对三者(a、a[0]、&a[0][0])的地址是否相同进行验证

1 #include

2

3 main()

4 {

5 int a[2][2];

6

7 printf("**%p**\n**%p**\n**%p**\n", a, a[0], &a[0][0]);

8 }

运行结果

b162682f01e9fd68e3682f9d961fbcde.png

在用数组的地址进行赋值的时候,虽然三者值相同,但是三者不可随意混用(以int a[2][2]为例)

a--------是int (*)[2]型

a[0]-----是int *型

&a[0][0]-是int *型

读者可能注意到上述有两个类型都是int *型的,所以下述两种赋值方法等价

第一种:

1 int a[2][2] = {1, 2, 3, 4};

2 int *p;

3 p = a[0];

第二种:

1 int a[2][2] = {1, 2, 3, 4};

2 int *p;

3 p = &a[0][0];

对于int a[2][2]来说,如果将a[0]改为&a[0],那么&a[0]和a的类型相同,都为int (*)[2]类型

也可以用一维指针数组来保存二维数组中某个元素的地址

1 int a[2][2] = {1, 2, 3, 4};

2 int *p[2];

3 p[0] = &a[0][0];

4 printf("%d", *p[0]);

四、二维数组的解引用

以二维数组a[2][3]={1, 2, 3, 4 ,5, 6};为例

第一种:*(*a+1)--------等价于a[0][1],因为*的优先级比+高,所以先解引用,进入第二维在第二维里面地址+1,再次解引用得到元素值

第二种:*(*(a+1))------等价于a[1][0],比上面第一种多加了一个括号,括号优先级最高,先+1移动地址(注意是在第一维里面移动),然后解引用进入第二维,再解引用得到元素的值

第三种:*(&a[0][0]+1)--等价于a[0][1],这里使用了&取地址符,将原本表示第一个元素的a[0][0]返回到第二个维度,然后第二维地址+1,再解引用得到元素的值

为方便读者理解下面上图

b0a13a11a1f13e26bc38557c9665c931.png

标签:int,元素,地址,二维,数组,指针

来源: https://www.cnblogs.com/lanhaicode/p/10366150.html

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值