什么是浮动*a[];用c申报?
假设float*a[];在主方法NC中声明。我正在努力学习指针,理解上面的意思 我猜它声明了一个指向数组a[]的第一个元素的指针。 但是[]没有任何元素。。 我真的很困惑什么是浮动*a[];用c申报?,c,C,假设float*a[];在主方法NC中声明。我正在努力学习指针,理解上面的意思 我猜它声明了一个指向数组a[]的第一个元素的指针。 但是[]没有任何元素。。 我真的很困惑 感谢所有提供帮助的人。声明变量时,如果没有数组大小,则该变量是无效代码 a.c: In function ‘main’: a.c:2:11: error: array size missing in ‘a’ float *a[]; 使用数组大小,它将创建指针数组 测试: 注意,在C中有一种特殊情况,其中[]不声明数组
感谢所有提供帮助的人。声明变量时,如果没有数组大小,则该变量是无效代码
a.c: In function ‘main’:
a.c:2:11: error: array size missing in ‘a’
float *a[];
使用数组大小,它将创建指针数组
测试:
注意,在C中有一种特殊情况,其中[]不声明数组,而是声明指针。声明函数参数时:
void f(float *a[], size_t n) {
// ...
}
[]被视为指针声明,因此它等效于:
void f(float **a, size_t n) { // ...
由于数组作为参数传递给函数时会衰减为指向其第一个元素的指针,因此函数可以接受数组:
int main() {
int n = 100;
float *a[n];
// ... Initialize the array here ...
f(a, n);
return 0;
}
这是C语言的一个怪癖。如果编译器不需要知道数组的大小,可以给出一个空数组大小
float *a[];
这在两种情况下都是如此:
外部声明
函数参数类型
例1:
使用上面的行告诉C编译器在某个C文件中有一个名为a的浮点*元素数组
例2:
使用该行可以指定参数类型为浮点*元素数组
这两种方法都可以使用,因为编译器不需要知道数组的大小就可以访问它。编译器只需要知道为数组保留内存的大小
float *a[];
在这两种情况下,extern和function参数都只引用已经占用内存的现有数组。因此,不需要保留内存,编译器也不需要知道数组的大小
float *a[];
是浮点指针数组的不完整声明,因为它没有大小。在某些情况下,还需要有一个定义声明,明确地或使用初始值设定项指定元素的数量:
float *a[];
...
float *a[N];
或
作为结构类型的成员,例如
struct foo {
int something;
int something_else;
float *a[];
};
它是一个灵活的数组成员——如果您只声明一个类似struct foo的实例
那么它不是你不能访问的对象的一部分bar.a[i]。但是,如果动态分配对象,则可以为数组指定额外空间:
struct foo *p = malloc( sizeof *p + sizeof *(p->a) * N );
这相当于将结构类型定义为
struct foo {
int something;
int something_else;
float *a[N];
};
你能在半完整程序的上下文中显示这一点吗?@bruno指向浮点数组的指针看起来如何?float*a[];主要是语法错误。所以你的问题毫无意义。请提供一个实际可编译的变量。我投票将这个问题作为主题外的问题来结束,因为它甚至不会编译,所以讨论它的含义是毫无意义的。来自编译器的错误消息是:数组类型变量的定义需要显式大小或initializerfloat*a[100];与float*a[]完全不同;,虽然。从像a[]这样的行中,问题中没有任何元素,但很明显,括号之间缺少数字是问题的一个故意部分,不管它是否基于其他误解或误读。@user2357112,好的,调整过。最好涵盖该类型的函数参数,因为我怀疑那是OP看到它的地方。我看了你的分数,所以我认为你知道。作为函数参数,float*a[]相当于float**a。只是C语言的一个怪癖。
struct foo {
int something;
int something_else;
float *a[];
};
struct foo bar;
struct foo *p = malloc( sizeof *p + sizeof *(p->a) * N );
struct foo {
int something;
int something_else;
float *a[N];
};