struct的运算符的C地址,但不是数组?

时间:2015-10-26 01:12:50

标签: c struct

为什么我能这样做....

int numbers[100];
int * intPtr = numbers;

不使用运营商的地址,但......

typedef struct {
    int x;
    int y;
} Vec2D;

Vec2D vec;
Vec2D * vecPtr = &vec;

也就是说,为什么结构上需要运算符的地址?为什么vec不是地址?

2 个答案:

答案 0 :(得分:2)

你的比喻被打破:公平比较将在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]

答案 1 :(得分:1)

大小 N 的数组基本上是指向包含 N 对象的连续内存块的指针。 [i]运算符指定 ith 对象所在指针的偏移量。所以基本上numbers本身只是一个指针 例如,

int main(){
int numbers[100];
numbers[0] = 1;
printf ("%d\n", numbers);
}

会抛出错误,因为它将数字指定为指针,而不是整数。