![](/img/trans.png)
[英]Why is sizeof a char literal not the same as sizeof(char)?
[英]Why char* type casting is important to get sizeof a variable?
如果有的话
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为单位,但是这两个术语通常可以互换)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.