为什么这个指针被强制转换为char而不是其他任何?

时间:2013-04-04 05:02:03

标签: c

在实现我自己的sizeof运算符时,我遇到了一个例子,如下所述。

#define my_sizeof(type) (char *)(&type+1)-(char*)(&type)
int main()
{
    double x;
    printf("%d", my_sizeof(x));
    getchar();
    return 0;
}

我不确定他们为什么在#define中使用(char *)而不是任何其他类型的演员。我需要知道所述语法的确切含义。有人可以帮助我理解这个......?

提前致谢。

2 个答案:

答案 0 :(得分:7)

了解它,你需要知道,当你写

double d[2];
double *p = d;
p = p + 1;      p is now pointing to the next double i.e. &d[1] 
内存中的

p已向前移动sizeof(double)个字节

如果将p视为字符指针,则可以获得偏移量已更改的字节数:

double d[2];
double *p = d;
char* start = (char*)p; 
p = p + 1;
char* end = (char*)p;

现在end-start给出了字节(字符)IOW sizeof(double)的偏移量。

答案 1 :(得分:1)

在C中,sizeof char是(根据定义)1。它们转换为char *以便能够减去指针以获得指向的对象的大小。

这将主要起作用,但AFAIU不顾一切地“指向下一个对象”,如果它不在数组中并不总能保证正常工作。此外,在数组中具有requited padding的对象的大小不一定是对象的大小。

Bletcherous。只需使用sizeof即可。 `