如果有,
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.
答案 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
中,但是这两个术语通常可互换。)