-1

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

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

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

提前致谢。

4

2 回答 2

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)

于 2013-04-04T05:18:41.183 回答
1

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

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

无理取闹。只需使用sizeof. `

于 2013-04-04T18:19:23.777 回答