鱼C论坛

 找回密码
 立即注册
查看: 2656|回复: 7

[技术交流] S1E23课后题,对小甲鱼的表述的疑问

[复制链接]
发表于 2021-4-23 22:45:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
关于S1E23课后习题的疑问点:
1.小甲鱼说int(*p)[10] 跨度是 sizeof(int) * 10;我不认同,因为数组指针本质也是指针啊,指针就应该占4字节(64位系统,8字节)——见下方截图1
2.小甲鱼说array 的跨度是 sizeof(array[0])    ;我也不认同,array既表示首元素地址,还表示整个数组,应该占sizeof(array[0])*10——见下方截图1。   
   既然array既表示首元素地址,也表示整个数组,那么,printf(“%d”,array),为何默认打印的是首元素地址,而不是整个数组?
我用代码验证了下我的想法,发现我好像是对的。   真是这样吗?
3.我百度了CSDN,贴子写64位系统地int占8个字节??  我自己运行,是4个字节啊;怀疑人生。。。
#include <stdio.h>

int main()
{
        int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        int (*p)[10] = &array;

        printf("%d\n", sizeof(&array));
        printf("%d\n", sizeof(p));
        printf("%d\n", sizeof(array));
        printf("%d\n", sizeof(array[0]));

        return 0;
}

运行结果:
8
8       //我是64位系统
40     //array指整个数组,是sizeof(int)*10
4       //int型占4Bytes
捕获1.PNG
捕获2.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-24 00:11:56 | 显示全部楼层
标准并没有规定int是多少个字节
不同的编译环境很有可能不一样
我的64位系统int也是4个字节
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-24 00:22:40 | 显示全部楼层
int(*p)[10] 跨度是 sizeof(int) * 10
你说这个不对,那么你认为对的结果是?


数组的名字是数组第0个元素的地址,忘了吗?
array 和 &array[0]
这两个是一回事
而 &array 是另一回事了


现在,你的3个问题解决了多少?
哪里还不明白可以继续提问
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-24 11:09:32 | 显示全部楼层
人造人 发表于 2021-4-24 00:11
标准并没有规定int是多少个字节
不同的编译环境很有可能不一样
我的64位系统int也是4个字节

那如何做到统一呢?  相当于,我的代码,放在你的编译器运行,就会出错咯?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-24 11:14:31 | 显示全部楼层
人造人 发表于 2021-4-24 00:22
int(*p)[10] 跨度是 sizeof(int) * 10
你说这个不对,那么你认为对的结果是?

3个问题还没开始做呢。

我答案写的很清楚,我认为int(*p)[10],占4个字节,因为数组指针,本质上还是指针。  是指针,就应该只占4个字节。
下图我们大学(某不知名985)教材也写的清清楚楚啊。   
你别光嘴巴说啊,你自己运行下看看呗
教材 Page233.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-24 14:00:11 | 显示全部楼层
weijun_zhang 发表于 2021-4-24 11:09
那如何做到统一呢?  相当于,我的代码,放在你的编译器运行,就会出错咯?

要做到可移植,那就不要去假设类型所占用的字节
stdint.h 中有
int8_t
int16_t
int32_t
uint8_t
uint16_t
uint32_t

stdint.h中会根据当前编译环境进行typedef
顾名思义 int32_t  uint32_t
这个不管在哪个编译环境都是4个字节,32位
一个有符号,一个无符号

limit.h中给出了类型占用的字节数


要做到可移植,需要这两个头文件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-24 14:03:33 | 显示全部楼层
weijun_zhang 发表于 2021-4-24 11:14
3个问题还没开始做呢。

我答案写的很清楚,我认为int(*p)[10],占4个字节,因为数组指针,本质上还 ...

int(*p)[10]
p是一个指针,32位是4个字节,64位是8个字节
p的跨度是 40 个字节(按int 4个字节算)
也就是 p + 1 的地址值比 p 大 40 个字节

有问题吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-24 14:05:32 | 显示全部楼层
weijun_zhang 发表于 2021-4-24 11:14
3个问题还没开始做呢。

我答案写的很清楚,我认为int(*p)[10],占4个字节,因为数组指针,本质上还 ...

小甲鱼说int(*p)[10] 跨度是 sizeof(int) * 10

他说的是跨度,是  p + 1 比 p 大多少个地址值
你说的是 p 的大小
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-14 15:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表