char a[64][]
相当于char *a[64]
?
如果是,如果我想使用单个指针声明char a[][64]
该怎么办?我该怎么办?
答案 0 :(得分:3)
答案 1 :(得分:2)
您正在寻找pointer to an array:
char (*a)[64];
答案 2 :(得分:2)
也许您不确定以下两种陈述是如何不同的。
char* a[64];
char (*a)[64];
第一个将a
定义为64
char*
个对象的数组。这些指针中的每一个都可以指向任意数量的char
s。 a[0]
可以指向10
char
的数组,而a[1]
可以指向20
char
的数组。你会这样做:
a[0] = malloc(10);
a[1] = malloc(20);
第二个将a
定义为指向64
个字符的指针。您可以使用以下内容为a
分配内存:
a = malloc(64);
您还可以使用以下内容为a
分配内存
a = malloc(64*10);
在第一种情况下,您只能使用a[0][0]
... a[0][63]
。在第二种情况下,您可以使用a[0][0]
... a[9][63]
答案 3 :(得分:2)
char a[64][]
相当于char *a[64]
。
不,因为char a[64][]
是错误的。它尝试将a
定义为64
个元素的数组,其中每个元素的类型为char[]
- 不完整的类型。您无法定义不完整类型的元素数组。元素的大小必须是固定的已知常量。 C99标准§6.7.5.2¶2说
元素类型不应是不完整或函数类型。
现在,如果你要比较char a[][64]
和char *a[64]
,那么它们又是不同的。那是因为数组下标运算符的优先级高于*
。
// declares an array type a where element type is char[64] -
// an array of 64 characters. The array a is incomplete type
// because its size is not specified. Also the array a must have
// external linkage.
extern char a[][64];
// you cannot define an array of incomplete type
// therefore the following results in error.
char a[][64];
// however you can leave the array size blank if you
// initialize it with an array initializer list. The size
// of the array is inferred from the initializer list.
// size of the array is determined to be 3
char a[][2] = {{'a', 'b'}, {'c', 'd'}, {'x', 'y'}};
// defines an array of 64 elements where each element is
// of type char *, i.e., a pointer to a character
char *a[64];
如果要在函数参数中声明指向数组的指针,则可以执行以下操作 -
void func(char a[][64], int len);
// equivalent to
void func(char (*a)[64], int len);
char (*a)[64]
表示 a
是指向char[64]
类型对象的指针,即64
个字符的数组。将数组传递给函数时,它会隐式转换为指向其第一个元素的指针。因此,相应的函数参数必须具有类型 - pointer to array's element type
。