在C中键入一个无约束浮点数组

Tim*_*Tim 8 c arrays typedef

我为float数组创建了一个typedef,如下所示:

typedef float fooType[];
Run Code Online (Sandbox Code Playgroud)

这样我就可以静态地声明和初始化float数组:

fooType myArray = {1.0, 2.0, 3.0}
Run Code Online (Sandbox Code Playgroud)

这很好.我可以说myArray[2]没有任何问题,一般fooType按照我的意愿使用我.在我的程序环境中,很明显fooType是一个数组类型(它实际上是一个巨大的查找表),这就是为什么我不是简单的做typedef float fooType.

然后我如何声明并使用变量指向bar并访问元素bar?我不能像这样声明一个简单的变量:

fooType bar = myArray;
Run Code Online (Sandbox Code Playgroud)

既然错误了invalid initializer; 我没想到它会起作用,因为编译器不知道要分配多少内存.我尝试了一些指针:

fooType *bar = myArray; 
Run Code Online (Sandbox Code Playgroud)

这给出了一个警告:initialization from incompatible pointer type当我使用bar[1].. 访问元素时出现错误.这声明很好,正如我所期望的那样,因为类型现在匹配:

fooType *bar = &myArray;
Run Code Online (Sandbox Code Playgroud)

但正如上面的编译错误一样,invalid use of array with unspecified bounds我说bar[1].

这有效:

float *bar = myArray; 
float val = bar[3]; 
Run Code Online (Sandbox Code Playgroud)

但我不想,因为我失去了typedef的可读性.

我在一个可爱的OO世界(Java)中被埋葬了很长时间,所以我希望从中了解在这种情况下C语言中的惯用语.如果没有直接的解决方案,我已经准备好改变我对typedef的使用以适应惯例.我有一种感觉,但并不复杂.

谢谢

Jas*_*son 5

你在这里遇到的问题是,数组不是C中的指针,而是在赋值运算符的右侧使用时衰减到第一个元素的指针.因此,如果您声明一个数组

fooType myArray = {1.0, 2.0, 3.0}
Run Code Online (Sandbox Code Playgroud)

myArrayis float[3]和&myArray 的类型(*float)[3],或"指向3个浮点数组的指针".因此,你不能简单地说

fooType *bar = myArray;
Run Code Online (Sandbox Code Playgroud)

该类型fooType*不是指向float的指针...因此它是一种不兼容的指针类型.干

fooType* bar = &myArray;
Run Code Online (Sandbox Code Playgroud)

确实有效,但你遇到的问题是它bar[1]不是数组中的元素myArray,因为bar它本身就是一个指针.你将不得不取消引用bar喜欢(*bar)[1]在访问一个元素myArray.例如:

typedef float fooType[];
fooType myArray = {1.0, 2.0, 3.0}
fooType* bar = &myArray;
(*bar)[1] = 5.0;
Run Code Online (Sandbox Code Playgroud)

最后,请记住,使用C,您不能将一个数组分配给另一个数组...所以您可以执行以下操作:

fooType bar = myArray;
Run Code Online (Sandbox Code Playgroud)

这可以追溯到数组的整个问题以及它们对第一个元素的指针衰减,以及数组本身的类型与数组中第一个元素的类型不同的事实.

您最终可能只想输入数组,然后在使用时输入数组元素类型,float这样任何使用您的代码的人都会知道一种元素属于另一种.