2021-01-16 关于c primer plus 10.7的思考(二维数组名不等同于二维指针)

我花了好久看一个关于指针的知识点
最后理清了自己一直以来都存在的一个误区
心情很好,虽然没有推动多少学习的进度,可是我觉得很愉快
visual studio中,不同类型的指针变量是可以无警告无报错地赋值的(无所谓类型和维度,说起来我认为维度不同也可以作为类行不同的一部分),但是进行加一运算打印它们的值,就会发现结果这时候取决于它们的类型
之前我一直以为这样的赋值是严格要求的,今天才知道是可以无警告无报错,嗯
对本质的理解更进一步了,都是指针变量而已,赋值当然可以(看来编译器并没有在这一点上进行详细检查
嗯问了昊昊哥,他没给我什么帮助其实,我想,当我有资料和电脑,自己找出答案是最保险的办法

c primer plus中的‘无效’两字,是指的这样做没什么意义(因为你将不同类型的指针赋值,然后分别加一,得到的结果是无法预料的——类型不同,毕竟指针加一并不是按照字节,而是按照类型),‘无效’并不是指错误或者不允许,而是没什么意义
嗯本质是,指针所谓的类型不同:它指向的东西的单位大小不一样
char*,int*,一维数组名,二维数组名,每次加一跳过的空间是不同的
所以二维数组名虽然是地址的地址,和单纯的二维指针还是不一样的,大家指向的都是地址,但是这个地址的单位大小不一样,二维数组名单位地址大小是一层的大小,比如int a[3][2],a+1就是从a[0]跳到了a[1],跳过了2个int大小的空间,而int**p,它加一,就是跳过了一个int*的空间,这一点从定义指向二维数组的指针的形式也能看出来:int (*pp)[2],这个定义当中已经包含了单位大小是2个int空间的提示,和int**p是不同的
同样的,刚才又想到,虽然不同类型的指针(包括维度不同)之间可以无报错无警告地互相赋值,但是不仅是在指针加减上结果不同,解引用的结果也会不一样
我想解引用也是需要按照它类型的提示来往后选择空间并解析成对应的值
编译器的无报错无警告并不是那么靠谱,c果然很强调信任程序员
有利有弊,我喜欢自由度高的语言,我喜欢c  
出现问题,是因为对本质理解的不清楚。让我想起来高中的时候给别人讲题,如果对方听不懂,最终我会发现是自己对那道题有地方没理解到位,所以讲不清楚
钻研好啊,我喜欢清晰掌握一切的感觉 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值