为什么char *类型转换对于获取变量的大小很重要?

时间:2014-07-30 13:37:18

标签: c gcc

如果有,

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.

1 个答案:

答案 0 :(得分:4)

带指针的算术总是以元素的大小的倍数运行,而不是字节。这是因为像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中,但是这两个术语通常可互换。)