C语言 为什么char*类型转换对于获得变量的sizeof很重要



如果我们有,

int p;
int res;
res= (char*)(&p+1)-(char*)(&p)
printf("size of p= %d",res);

因此,p的大小将打印4。哪个是正确答案

但是,如果我不使用(char*),例如,

res=(&p+1)-(&p)

我得到res=1作为输出。那么,为什么(char*)类型转换对于获得p变量的大小很重要呢?

当我打印(&p+1)(&p)的值时,差值是4,但是当我打印差值时,它输出1。

带指针的算术操作总是以元素大小的倍数进行操作,而不是以字节为单位。这是因为像array[2]这样的表达式的作用与*(array + 2)相同。如果array的类型是int *,那么array[2]*(array + 2)应该指向同一个元素。如果array + 2指向array后面两个字节,它将指向第一个元素的中间。因此,编译器会执行类似*((int *)((char *)array + 2 * sizeof(int)))的操作。

同样的事情发生在指针减法上,以保持加法和减法的基本性质。给定int *p = array + 2,则p指向第三个元素。然后,如果计算p - array,那么逻辑上,它应该等于2(因为如果计算z = x + y,那么计算z - x = y)。

此外,由于C标准要求char的大小为1,因此将指针转换为char *将以字节为单位给出差异(技术上,在char s中,但这两个术语通常是可互换的)。

最新更新