结构而不是数组的运算符的 C 地址?

标签 c struct

为什么我可以...

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/

相关文章:

c - 在C中复制2D数组的内容

c - 在C中读取目录文件

c 排序大型结构数组并打印到屏幕

c - 如何实现继承: error: conflicting declaration ‘typedef struct

c - 写入通过结构传递给线程的 mmap 输出 (C)

c - 读取特定的输入并以相同的格式打印它

c - 返回包含数组的结构

c - 图书馆管理项目的数据结构

c++ - 按名称获取属性

C 二叉搜索树插入