在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以来的数组元素类型,这样任何使用你的代码的人都会知道一种元素属于另一种. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |