二维数组是二级指针pointer to pointer!

二维数组居然是个类似于二级指针(pointer to pointer)的东西,十分震惊!

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

运行结果:

&a:2686672,&a[0]:2686672
a:2686672,a[0]:2686672
*a:2686672,*a[0]:1
**a:1

由此可见 a[0][0]是一个整型变量,a[0]是一个指针(pointer),a是个二级指针(pointer to pointer)

并且a,a[0],a[0][0]的地址是相同的,但a依然是指向a[0]地址的指针,a[0]依然是指向a[0][0]的指针

因此二维数组的操作也变复杂点了,以下一道题用以验证及训练

设有如下数组定义: int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}}; 计算下面各项的值(设一个int类型数占四个字节)。

(1)a[2][1]		(2)a[1]		(3)a			(4)a+1
(5)*a+1		(6)*(a+1)	(7)a[2]+1		(8)*(a+1)+1
(9)*(*(a+2)+2) 

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

运行结果:

a[1]:2686688
a:2686672
*a:2686672
a+1:2686688
*a+1:2686676
*(a+1):2686688
a[2]+1:2686708
*(a+1)+1:2686692
*(*(a+2)+2):21

 

小结:

二级指针 指针     整型变量

a    →    a[0] → a[0][0]

            a[1] → a[1][0]

            a[2] → a[2][0]


可以推广到一维数组就是一个指针,三维数组是个三级指针了

验证一维数组是指针(pointer)

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

 

运行结果:

&a:2686708,&a[0]:2686708
a:2686708,a[0]:1
*a:1

 

转载于:https://www.cnblogs.com/someblue/p/3364479.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值