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

前端之家收集整理的这篇文章主要介绍了在C中键入一个无约束的浮点数组前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我为float数组创建了一个typedef,如下所示:
typedef float fooType[];

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

fooType myArray = {1.0,2.0,3.0}

这很好.我可以毫无问题地说myArray [2]并且通常使用我喜欢的fooType.在我的程序的上下文中,很明显fooType是一个数组类型(它实际上是一个巨大的查找表),这就是为什么我不是简单地做typedef float fooType.

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

fooType bar = myArray;

由于初始化程序无效的错误;我没想到它会工作,因为编译器不知道要分配多少内存.我尝试了一些指针:

fooType *bar = myArray;

这给出了一个警告:当我使用bar [1]访问元素时,从不兼容的指针类型初始化和错误.这声明很好,正如我所期望的那样,因为类型现在匹配:

fooType *bar = &myArray;

但是,如上所述编译器错误,当我说bar [1]时,使用带有未指定边界的数组无效.

这有效:

float *bar = myArray; 
float val = bar[3];

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

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

谢谢

解决方法

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

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

fooType *bar = myArray;

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

fooType* bar = &myArray;

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

typedef float fooType[];
fooType myArray = {1.0,3.0}
fooType* bar = &myArray;
(*bar)[1] = 5.0;

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

fooType bar = myArray;

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

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

猜你在找的C&C++相关文章