如何使用单个指针定义双维数组

时间:2014-04-15 05:27:24

标签: c pointers multidimensional-array

char a[64][]相当于char *a[64]

如果是,如果我想使用单个指针声明char a[][64]该怎么办?我该怎么办?

4 个答案:

答案 0 :(得分:3)

char a[][64]

与指针表示类似

char (*a)[64]

你可以阅读this。对于2D数组,应指定第二个维度大小。

答案 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