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