S1E23课后题,对小甲鱼的表述的疑问
关于S1E23课后习题的疑问点:1.小甲鱼说int(*p) 跨度是 sizeof(int) * 10;我不认同,因为数组指针本质也是指针啊,指针就应该占4字节(64位系统,8字节)——见下方截图1
2.小甲鱼说array 的跨度是 sizeof(array);我也不认同,array既表示首元素地址,还表示整个数组,应该占sizeof(array)*10——见下方截图1。
既然array既表示首元素地址,也表示整个数组,那么,printf(“%d”,array),为何默认打印的是首元素地址,而不是整个数组?
我用代码验证了下我的想法,发现我好像是对的。 真是这样吗?
3.我百度了CSDN,贴子写64位系统地int占8个字节??我自己运行,是4个字节啊;怀疑人生。。。
#include <stdio.h>
int main()
{
int array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int (*p) = &array;
printf("%d\n", sizeof(&array));
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(array));
printf("%d\n", sizeof(array));
return 0;
}
运行结果:
8
8 //我是64位系统
40 //array指整个数组,是sizeof(int)*10
4 //int型占4Bytes
标准并没有规定int是多少个字节
不同的编译环境很有可能不一样
我的64位系统int也是4个字节
int(*p) 跨度是 sizeof(int) * 10
你说这个不对,那么你认为对的结果是?
数组的名字是数组第0个元素的地址,忘了吗?
array 和 &array
这两个是一回事
而 &array 是另一回事了
现在,你的3个问题解决了多少?
哪里还不明白可以继续提问
人造人 发表于 2021-4-24 00:11
标准并没有规定int是多少个字节
不同的编译环境很有可能不一样
我的64位系统int也是4个字节
那如何做到统一呢?相当于,我的代码,放在你的编译器运行,就会出错咯? 人造人 发表于 2021-4-24 00:22
int(*p) 跨度是 sizeof(int) * 10
你说这个不对,那么你认为对的结果是?
3个问题还没开始做呢。
我答案写的很清楚,我认为int(*p),占4个字节,因为数组指针,本质上还是指针。是指针,就应该只占4个字节。
下图我们大学(某不知名985)教材也写的清清楚楚啊。
你别光嘴巴说啊,你自己运行下看看呗 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_tuint32_t
这个不管在哪个编译环境都是4个字节,32位
一个有符号,一个无符号
limit.h中给出了类型占用的字节数
要做到可移植,需要这两个头文件
weijun_zhang 发表于 2021-4-24 11:14
3个问题还没开始做呢。
我答案写的很清楚,我认为int(*p),占4个字节,因为数组指针,本质上还 ...
int(*p)
p是一个指针,32位是4个字节,64位是8个字节
p的跨度是 40 个字节(按int 4个字节算)
也就是 p + 1 的地址值比 p 大 40 个字节
有问题吗? weijun_zhang 发表于 2021-4-24 11:14
3个问题还没开始做呢。
我答案写的很清楚,我认为int(*p),占4个字节,因为数组指针,本质上还 ...
小甲鱼说int(*p) 跨度是 sizeof(int) * 10
他说的是跨度,是p + 1 比 p 大多少个地址值
你说的是 p 的大小
页:
[1]