c-2.2.3-二级间接指针和指针数组的思考


以下有两种定义字符串数组的方式:
方式一:
char  * menu[] = {
    "a - addnew record",
    "d - delete record",
    "q - quit",
    NULL    //(void *) 0
};
方式二:
char  ** menu= {
    "a - addnew record",
    "d - delete record",
    "q - quit",
    NULL    //(void *) 0
};
其中,方式一可以正常编译运行,方式二在gcc中提示warning:incompetable pointer,在vs中提示更改为
char *menu = {"a - addnew record"};的形式,编译提示错误。

分析:
从语法的角度来讲,二级间指指针和二维数组二者可以相互赋值,只是数组变量是一个const类型常变量,不能改变其值,而二级间指指针是一个普通变量,可以改变值。而且,如果同时定义了指针数组和二级间指指针,二级间指指针是可以被赋值的。即:
char *menu[] = {"abc", "cde", "edf"};
char ** menu_pp;
menu_pp = menu; 
我认为方式二的方式应该是正确的,但是编译为什么不能通过呢?

经过跟师兄的咨询和讨论,推断可能是以下原因造成的:
1、方式一和二在编译时,都是先为字符串常量在常量区开辟四段内存。
2、数组内存开辟完成后,方式一定义的为指针数组,则继续开辟一段存放4个指针变量的数组内存,内存首地址存放到menu当中,内存开辟完成后将4段字符串的首地址放入指针数组当中,完成资源分配。
3、数组内存开辟完成后,方式二因为只定义了一个二级间指指针menu,只有存放一个指针类型数据的空间,所以vs中提示更改为上面的形式,来指向一个数组。
4、因此,我认为方式二出错的原因是,二级间指指针的定义方式下,编译器不会自动开辟指针数组,因此就无法完成二级间指到字符串数组的中间过程。

方式一:
方式二:

指针数组可以对二级间指指针直接赋值解释:

总结:
1、语法只是规定了程序的运行时表现,一些具体的问题应该考虑程序的具体编译和过程。


参考文献:
《c语言程序设计(第三版)》谭浩强


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值