神奇的C语言三:二维数组与二级指针

来源:互联网 发布:淘宝店铺代码下载 编辑:程序博客网 时间:2024/04/29 15:54



 例子3

下面的输出是什么呢?

#include<stdio.h>int a[2][5] = { 0,1,2,3,4,5,6,7,8,9};void f( int ** b){    printf( "%d\n", b[1][3]);}int main(){    f(a);    return 0;}
答案是会报段错误。解释如下:

先看看一个更容易理解的版本,当然二者是等价的。

#include<stdio.h>int a[2][5] = { 0,1,2,3,4,5,6,7,8,9};void f( (int*) b[]){    printf( "%d\n", (b[1])[3]);}int main(){    f(a);    return 0;}
函数f的参数是一个一维数组,其中存放的是一个int指针。b[1]就是取出a中的第二个数字,所以是1,。因为这是指针,所以指向内存地址1处;又它是int指针,所以指向的是int数组,那么其中第四个数的地址就是( 1 + 3 * sizeof( int)),也就是13。当然,这是一个非法地址,所以会报段错误,或者内存访问违例。

那么二维数组怎么写呢?

#include<stdio.h>int a[2][5] = { 0,1,2,3,4,5,6,7,8,9};void f( int (*b)[5]){    printf( "%d\n", b[1][3]);}int main(){    f(a);    return 0;}
这样就可以正确访问到8这个值了。可以这么理解f的参数的类型:

void f( int[5] b[]);

当然,也只是理解而已。这个问题是复习编译原理考试的时候遇到的,考了上面的源码,答案给的也是错误的(因为不相信答案,所以自己在VS上试了一下)。正确的理解应当是从编译器翻译的角度来理解,也就是如何计算多维指针地址之类的规定。无论如何,为了避免出错和给他人带来误解,实际中还是尽量避免复杂的语法吧 ^_^ 享受简单。



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 很久不用的邮箱号忘记密码怎么办 陕西省志愿云忘记密码和邮箱怎么办 国寿易学堂忘记登录密码怎么办 百度云下载显示本地空间不足怎么办 百度云离线内容违规无法下载怎么办 百度云压缩包要压解密码没有怎么办 用2016酷我音乐制作铃音怎么办 邮箱跟手机号一同绑定支付宝怎么办 网易邮箱取消账户关联没反应怎么办 剑三重置版客户端修复不成功怎么办 网易闪电邮的邮件满了怎么办 忘了手机的账号和密码怎么办 手机绑定的扣扣达到十个上限怎么办 邮箱发送邮件到上限无法发送怎么办 路由器重置后不知道账号密码怎么办 发出的邮件别人看了撤回不了怎么办 域名和邮箱是不同的公司怎么办 qq音乐听过的歌单找不到了怎么办 快手开直播前置摄像头太暗怎么办 小米手机帐号绑定无法侠用怎么办 用交易猫买完游戏账号被骗了怎么办 一个华为账号有两个游戏账号怎么办 加密u盘电脑上打开空怎么办 国网加密u盘电脑打开为空怎么办 足球竞彩软件下架后里面的钱怎么办 竞彩足球提现不到账怎么办 竞彩足球投注后输了怎么办 英雄联盟鼠标箭头右键点不了怎么办 上古卷轴5数值修改错了怎么办 小时候打针把屁股脂肪打扁了怎么办 大繁盛满腹市场2对话时闪退怎么办 月经来了一个月了还不停怎么办 对办公室的异性老师产生好感怎么办 上古卷轴5任务NPC老打我怎么办 1岁半宝宝走路内八字怎么办 最近几个月例假周期都25天怎么办 从pr导出的视频大小不一样怎么办 合作医疗收据丢了不给报销怎么办 沧州新生医院—老人腹胀了该怎么办 内痔疮术后一个月吃了点辣椒怎么办 肛周脓肿手术后大便干怎么办