什么是浮动*a[];用c申报?

什么是浮动*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中有一种特殊情况,其中[]不声明数组

假设float*a[];在主方法NC中声明。我正在努力学习指针,理解上面的意思

我猜它声明了一个指向数组a[]的第一个元素的指针。 但是[]没有任何元素。。 我真的很困惑


感谢所有提供帮助的人。

声明变量时,如果没有数组大小,则该变量是无效代码

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];
};