我对这两个声明感到困惑
int *a
; int (*a)[3]
据我了解,这两个都为我们提供了一个指向内存中没有内容的指针。第二个示例显示为指向内存中3个int数组的指针的示例。但是由于尚未分配该内存,因此没有任何意义。
要使指针指向内存中3个整数的数组,我们需要执行a = (int*)malloc(sizeof(int) * 3)
。在第一个和第二个中都这样做,这两者都会给我一个指向存储位置的指针,该存储位置中12个连续字节存储了我的3个数字。
那么,如果最终不得不使用malloc,为什么还要使用int (*a)[3]
呢?
答案 0 :(得分:4)
那么,如果最终不得不使用malloc,为什么还要使用int(* a)[3]?
当您要使用动态内存创建 real 2d数组时,它对于可变长度数组非常有用:
#include <stdio.h>
#include <stdlib.h>
void *fn_alloc(int rows, int cols)
{
int (*arr)[cols];
int i, j;
arr = malloc(sizeof(int [rows][cols]));
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
arr[i][j] = (i * cols) + j;
}
}
return arr;
}
void fn_print(int rows, int cols, int (*arr)[cols])
{
int i, j;
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
printf("\t%d", arr[i][j]);
}
printf("\n");
}
}
int main(void)
{
int rows, cols;
scanf("%d %d", &rows, &cols);
int (*arr)[cols] = fn_alloc(rows, cols);
fn_print(rows, cols, arr);
free(arr);
return 0;
}
换句话说,当涉及到动态内存时,您的第一个声明对于指向n维的数组很有用,而第二个声明则指向n维的数组n个维度。
答案 1 :(得分:0)
那么,如果最终不得不使用malloc,为什么还要使用int(* a)[3]?
由于在大多数情况下(动态调整大小的2D矩阵),您应该使用flexible array members来获取一些抽象数据类型。 This answer与您的问题非常相关(几乎重复)。