为什么我可以...
int numbers[100];
int * intPtr = numbers;
不使用运算符(operator)的地址但是...
typedef struct {
int x;
int y;
} Vec2D;
Vec2D vec;
Vec2D * vecPtr = &vec;
也就是说,为什么结构上需要运算符的地址?为什么 vec
不是地址?
最佳答案
你的类比是错误的:公平的比较是 Vec2D *
和 int (*)[100]
,即指向对象的指针。但是,在您的第一段代码中,您正在使用不相关的语言机制(数组到指针衰减)获取指向 子对象 的指针。
以下按预期工作:
typedef int T[100];
T numbers;
T * p = &numbers; // or: int (*p)[100] = &numbers;
typedef Vec2D T;
T vec;
T * p = &vec; // or: Vec2D * p = &vec;
也可以获取指向子对象的指针:
int * p_elem = &numbers[0];
int * v_emen = &vec.x;
唯一特殊的神奇规则是数组表达式 numbers
可以衰减到它的第一个元素的地址,所以 &numbers[0]
与 numbers
(的结果)相同:
int * p_elem = numbers; // same as &numbers[0]
关于结构而不是数组的运算符的 C 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33337022/