一维数组

一维数组数组名可以视为指向第一个元素的指针(但数组名与指针实际上是不同的,比如用sizeof运算符求值时,sizeof对数组名求值会给出数组所占字节大小,而作用于指针时会给出指针字节数;但当数组名作为参数传递给函数时,它会失去这一额外信息)。

int num;
int *array;
scanf("%d", &num);
array = (int *)malloc(num*sizeof(int));

二维数组

二维数组可以视为一个一维数组,数组中每一项为另一个一维数组的数组首地址。

列数固定的二维数组

#define COL 10

int row;  //这个就是需要指定的行数
int (*p)[COL];  //p的类型为指向一个大小为col的一维数组的指针。比如`int a[col]; p=&a;`

printf("input the row of the array: ");
scanf("%d", &row); //取得行数

//动态生成二维数组,指定列数为col
p = (int (*)[COL])malloc(row*COL*sizeof(int));  //动态申请row行col列的二维数组

int i, j;
for (i=0; i<row; i++) {
    for (j=0; j<COL; j++) {
        p[i][j] = i*10 + j;
    }
}
for (i=0; i<row; i++) {
    for (j=0; j<COL; j++) {
        printf("%3d,", p[i][j]);
    }
    printf("\n");
}

free(p);

列与行都不固定的二维数组

int row;
int col;
int **array = NULL;

printf("input the row of the array: ");
scanf("%d", &row);
printf("input the col of the array: ");
scanf("%d", &col);

/*
 * 将array视为一个有row项`(int *)`型指针的一维数组
 */
array = (int **)malloc(row * (sizeof(int *)));
if (array == NULL) {
    return NULL;
}

int i;
int j;
for (i = 0; i < row; i++) {
    /*
     * 将array的每一项视为一个`int`型的一维数组
     */
    array[i] = (int *)malloc(col * sizeof(int));
    if (array[i] == NULL) {
        return;
    }
}

/*input data*/
for (i = 0; i < row; i++) {
    for (j = 0; j < col; j++) {
        array[i][j] = i*10 + j;
    }
}
/*output data*/
for (i = 0; i < row; i++) {
    for (j = 0; j < col; j++) {
        printf("%3d", array[i][j]);
    }
    puts("");
}
/*free every row point*/
for (i = 0; i < row; i++) {
    free(array[i]);
}
free(array);

用一维数组模拟二维数组

typedef struct {
    int row;
    int col;
    int *base;
} Table;

void init_table(Table *t, int row, int col)
{
    t->row = row;
    t->col = col;
    t->base = (int *)malloc(sizeof(int)*row*col);
    if (t->base == NULL){
        printf("Init table failed");
    }
}

#define ELEMENT(Table, r, c) (*(Table.base + (r)*Table.col + (c)))

一个问题

虽然在上面我将int array[]int *array=(int*)malloc(sizeof(int)*5)中的array互相代替,而且实际上用下标访问时它们的行为确实相同。但实际上它们在某些方面是不同的,比如:

int array[] = {1,2,3,4,5};
int *ptr = (int*)malloc(sizeof(int)*5);

printf("%lu\n", sizeof(array));  //会打印出数组所占的字节长度
printf("%lu\n", sizeof(ptr));  //会打印出指针的字节长度

在C/C++中,当数组作为函数的参数进行传递是,数组就自动退化为同类型的指针。