为什么我能这样做....
int numbers[100];
int * intPtr = numbers;
不使用运营商的地址,但......
typedef struct {
int x;
int y;
} Vec2D;
Vec2D vec;
Vec2D * vecPtr = &vec;
也就是说,为什么结构上需要运算符的地址?为什么vec
不是地址?
答案 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);
}
会抛出错误,因为它将数字指定为指针,而不是整数。