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的使用以适应惯例.我有一种感觉,但并不复杂.
谢谢
解决方法
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以来的数组元素类型,这样任何使用你的代码的人都会知道一种元素属于另一种.