gpt4 book ai didi

c - 将数组类型转换为指针?

转载 作者:太空狗 更新时间:2023-10-29 16:48:50 25 4
gpt4 key购买 nike

是否可以对数组进行类型定义?

我有一组 vector 函数,它们都接受一个指向 float 的指针, float 是三个 float 的数组。我可以 typedef float* vec3_t,但是它不会让我通过简单地将对象设置为等于括号中的数组来创建对象。

typedef float* vec3_t;

vec3_t a = {1,1,1}; // Does not work
vec3_t b = (float[]){1,1,1}; // Works
float c[] = {1,1,1}; // Works

void f(vec3_t x);

f({1,1,1}); // Error
f((float[]){1,1,1}; // OK

有人可以解释一下为什么会这样吗?

最佳答案

指针和数组不是一回事。虽然它们通常以相同的方式行事,但存在重大差异,您刚刚发现了其中之一。

您的代码实际做了什么

我用实际类型替换了类型定义类型,以使解释更清楚。

float c[] = {1,1,1};

您已经简单地创建并初始化了一个数组

f({1,1,1});

上面的代码既不是左值也不是右值。 {val1,...,valn} 语法只不过是一个初始化程序,不能在其他地方使用。

float* b = (float[]){1,1,1};

在这里您创建并初始化了一个数组,然后将它的位置存储在一个指针中。

f((float[]){1,1,1};

这种情况与上面的情况相同,但不是存储指针,而是将其作为参数传递给函数。

float* a = {1,1,1};

您正试图将三个变量写入尚未分配的内存位置。一般来说,{valn,...,valn} 是一个初始化器。此时你没有什么可以初始化的。因此,此语法无效。您正在尝试将气体倒入尚未制造的 jar 中。

虽然我理解您想要实现的目标,但您似乎误解了内存和指针的整个概念。想象一下这段代码,它(在一些肮脏的逻辑中)等同于你正在尝试做的事情:

float* a = NULL;
a[0] = 1;
a[1] = 1;
a[2] = 1;

如果你执行这段代码会发生什么?

现在你知道编译器为什么禁止它了。

关于c - 将数组类型转换为指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17025013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com