前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >进一步理解指针:一维数组和二维数组转换

进一步理解指针:一维数组和二维数组转换

作者头像
一见
发布2019-03-14 15:49:29
1.1K0
发布2019-03-14 15:49:29
举报
文章被收录于专栏:蓝天蓝天

先看下列代码的输出是什么?

代码语言:javascript
复制

 int main()
 {
     int m[5] = { 0,1,2,3,4 };
     int* p = (int*)(&m+1);
     printf("%d,%d\n", *(m+1), *(p-1));
     return 0;
 }

要知道这个输出,最关键的是要理解指针操作的“加”和“减”,假设有一指针ptr,则“ptr”中的“1”是指ptr所指类型的大小。因此上述代码中的“&m+1”中的“1”实质是“sizeof(m)”,而后一个“1”则“sizeof(m[0])”。 为什么“&m+1”中的“1”是“sizeof(m)”?根本原因在于“&a”实际是一个二维数组“int (*)[5]”的首地址,而不是一维数组“int [5]”的首地址,看下面这段代码就容易理解:

代码语言:javascript
复制
 int main()
 {
     int m[5] = { 0,1,2,3,4 };
     int* p = (int*)(&m+1);
     printf("%d,%d\n", *(m+1), *(p-1));
 
 
     int (*pp)[5] = (&m+1);
     --pp;
     printf("%d\n", pp[0][4]);
     return 0;
 }

而要注意:上面的“p”仍然是一个一维数组的首地址!下面演示把一个一维数组变成真正的二维数组使用:

代码语言:javascript
复制
 int main()
 {
     int m[5] = { 0,1,2,3,4 };
 
     int** ppm = (int**)m; // 这里也可以写成:int** ppm = (int**)&m;,&m、m和&m[0]的区别是什么?
      int (*pm)[3] = (int (*)[3])ppm;
     printf("%d\n", pm[1][1]);
 
     return 0;
 }

下列代码的输出又是什么了?或者代码有问题?

代码语言:javascript
复制
 int main()
 {
     int m[5] = { 0,1,2,3,4 };
 
 
     int** ppm = (int**)m;
     int (*pm1)[3] = (int (*)[3])&m;
     int (*pm2)[3] = (int (*)[3])ppm;
     int (*pm3)[3] = (int (*)[3])&ppm;
     printf("%d,%d,%d\n", pm1[1][1], pm2[1][1], pm3[1][1]);
 
 
     return 0;
 } 

指针加减,要看它指向的类型,移动大小是指向类型的大小。实际上,内存中的pm[0]和pm[1]是连续在一起的,并没有分成两行,只是为了理解二维数组经常被画成二维表格形式。 关联贴:常见指针定义解读(http://blog.chinaunix.net/uid-20682147-id-4344901.html)。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-04-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档