weijun_zhang 发表于 2021-4-23 22:45:08

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

人造人 发表于 2021-4-24 00:11:56

标准并没有规定int是多少个字节
不同的编译环境很有可能不一样
我的64位系统int也是4个字节

人造人 发表于 2021-4-24 00:22:40

int(*p) 跨度是 sizeof(int) * 10
你说这个不对,那么你认为对的结果是?


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


现在,你的3个问题解决了多少?
哪里还不明白可以继续提问

weijun_zhang 发表于 2021-4-24 11:09:32

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

那如何做到统一呢?相当于,我的代码,放在你的编译器运行,就会出错咯?

weijun_zhang 发表于 2021-4-24 11:14:31

人造人 发表于 2021-4-24 00:22
int(*p) 跨度是 sizeof(int) * 10
你说这个不对,那么你认为对的结果是?



3个问题还没开始做呢。

我答案写的很清楚,我认为int(*p),占4个字节,因为数组指针,本质上还是指针。是指针,就应该只占4个字节。
下图我们大学(某不知名985)教材也写的清清楚楚啊。   
你别光嘴巴说啊,你自己运行下看看呗

人造人 发表于 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_tuint32_t
这个不管在哪个编译环境都是4个字节,32位
一个有符号,一个无符号

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


要做到可移植,需要这两个头文件

人造人 发表于 2021-4-24 14:03:33

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 个字节

有问题吗?

人造人 发表于 2021-4-24 14:05:32

weijun_zhang 发表于 2021-4-24 11:14
3个问题还没开始做呢。

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

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

他说的是跨度,是p + 1 比 p 大多少个地址值
你说的是 p 的大小
页: [1]
查看完整版本: S1E23课后题,对小甲鱼的表述的疑问