【问题标题】:Typecasting an array to pointer?将数组类型转换为指针?
【发布时间】:2013-06-10 13:24:36
【问题描述】:

可以typedef一个数组吗?

我有一组向量函数,它们都接受指向浮点数的指针,浮点数是三个浮点数的数组。我可以 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

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

【问题讨论】:

  • 请注意typedef float* vec3_t 是一个指针,而不是一个数组。一个数组是typedef float vec3_t[3]。数组不是指针。
  • 我认为它与浮点数的字节长度有关。 char* 有效,因为一个 char 是 1 个字节。但是1个浮点数是...... 4个字节?不确定
  • 我认为标题与您的实际问题没有太大关系。请改写。

标签: c arrays pointers


【解决方案1】:

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

你的代码实际上做了什么

我已将 typedefed 类型替换为 real 类型,以使解释更清楚。

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} 是一个初始化器。此时你没有任何东西可以初始化。因此,此语法无效。您正试图将气体倒入尚未制造的罐中。

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

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

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

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

【讨论】:

  • 应该注意(float[]){1,1,1}是新的C99语法
【解决方案2】:

您的代码中必须堆放许多不同的功能,因此“为什么会这样工作”并不完全清楚您的意思。 “这个”具体是什么?

无论如何,为了“typedef an array”,你必须 typedef 一个数组,而不是指针

typedef float vec3_t[3];

之后你就可以做

vec3_t a = { 1, 1, 1 };

您的其余代码与类型定义数组无关。您只是发现了 compound literal 语法,即 (non-scalar-type) { initializers } 并创建给定类型的无名临时对象。 (non-scalar-type) 部分是复合文字语法的重要组成部分。不能省略。

所以,不要这样做

vec3_t a = { 1, 1, 1 };
f(a);

如果你不想拥有一个命名数组对象a,你可以这样做

f((vec3_t) { 1, 1, 1 });

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

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

同样的效果。

【讨论】:

  • 他的问题似乎是他认为{1,1,1}是一个数组。
【解决方案3】:

数组不是指针。一个数组一个基指针。但无论如何,最适合您尝试实现的数据结构是:

struct{
    float x;
    float y;
    float z;
} myFloat3;

数组对于可变长度结构和东西很方便,但不是最有效的选择,因为你知道你有 3 个浮点数并且你可以利用它。让编译器高效地打包你的大量结构,并从堆中分配你需要的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-20
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多