-3

假设 float *a[]; 在 main 方法 n c 中声明。我正在尝试了解指针并理解上述含义。

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

感谢任何帮助的人。

4

3 回答 3

6

声明变量时,没有数组大小的代码无效。

a.c: In function ‘main’:
a.c:2:11: error: array size missing in ‘a’
    float *a[];

使用数组大小​​,它会创建一个指针数组。

测试:

#include <stdio.h>

int main() {
   printf("float:           %zu\n", sizeof(float));
   printf("pointer:         %zu\n", sizeof(void*));

   float *a[100];
   printf("float *a[100]:   %zu\n", sizeof(a));

   float (*b)[100];
   printf("float (*b)[100]: %zu\n", sizeof(b));
   printf("*b:              %zu\n", sizeof(*b));

   return 0;
}

输出:

float:           4
pointer:         8
float* a[100]:   800       // a is an array of 100 float pointers.
float (*b)[100]: 8         // b is a pointer to an array of 100 floats.
*b:              400

请注意,在 C 中存在一种特殊情况,其中 a[]不声明数组,而是声明指针。声明函数参数时:

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 语言的一个怪癖。

于 2019-05-31T18:58:20.930 回答
4

如果编译器不需要知道数组的大小,则可以给定一个空数组大小。

在两种情况下会出现这种情况:

  • extern声明
  • 函数参数类型

示例 1:

extern float *a[];

使用上面的行告诉 C 编译器在某个 C 文件中存在一个float *元素数组。a

示例 2:

void someFunction(float *a[])

float *使用该行可以指定参数类型是元素数组。

两者都可以工作,因为编译器不需要知道数组的大小来访问它。编译器只需要知道为数组保留内存的大小。

在这两种情况下(extern和函数参数),您只会引用现有数组(已经占用内存)。因此不需要保留内存,编译器也不需要知道数组的大小。

于 2019-05-31T19:19:05.923 回答
1
float *a[];

是指针数组的不完整float声明,因为它没有大小。在某些时候,还需要一个明确的声明来指定元素的数量,或者显式地或使用初始化器:

float *a[];
...
float *a[N];

或者

float *a[];
...
float *a[] = {&a, &b, &c, ...};  // where a, b, c, ..., are objects of type float

作为struct类型的成员,例如

struct foo {
  int something;
  int something_else;
  float *a[];
};

它是一个灵活的数组成员struct foo——如果你只是声明一个类似的实例

struct foo bar;

那么它不是对象的一部分(你不能访问bar.a[i])。但是,如果动态分配对象,则可以为数组指定额外空间:

struct foo *p = malloc( sizeof *p + sizeof *(p->a) * N );

这相当于将结构类型定义为

struct foo { 
  int something;
  int something_else;
  float *a[N];
};
于 2019-05-31T19:38:29.247 回答