1. 程式人生 > >二維陣列動態申請與傳參

二維陣列動態申請與傳參

今天在寫八皇后時遇到了一些小問題,下面整理一下。

二維陣列初始化

用二階指標來申請:

#include <stdio.h>
#include <malloc.h>

/*
    這裡只做申請
*/
void makeDoubleArray(int row, int col) {
	int **array;
	int i, j;

	array = (int**)malloc(sizeof(int*) * row);
	for(i = 0; i < row; i++) {
		array[i] = (int *)malloc(sizeof(int*) * col);

		for(j = 0; j < col; j++) {
			printf("%p ", &array[i][j]);
			
			if(j == col - 1) {
				printf("\n");
			}
		}
	}

	for(i = 0; i < row; i++) {
		free(array[i]);
	}

	free(array);
}

void main(void) {
	makeDoubleArray(4, 8);
}

用二維陣列指標申請

#include <stdio.h>

void makeArray(int row) {
	int i;
	int j;

	int (*array)[8] = (int (*)[8])malloc(sizeof(int) * row * 8);

	for(i = 0; i < row; i++) {
		for(j = 0; j < 8; j++) {
			printf("%d ", array[i][j]);        //輸出自然都是垃圾資料

			if(j == 7) {
				printf("\n");
			}
		}
	}
}

void main(main) {
	makeArray(8);
}

用二維指標方法的缺陷是必須事先知道列數,限制較大。

也可用一維陣列申請x*y個空間的方法模擬申請二維陣列。

二維陣列傳參

在遍歷二維陣列的過程中需要將二維陣列傳參,下面是錯誤傳參方式示範:

void showArray(int **array) {
	int i;
	int j;

	for(i = 0; i < MAX_COL; i++) {
		for(j = 0; j < MAX_COL; j++) {
			printf("%d ", array[i][j]);

			if(j == MAX_COL - 1) {
				printf("\n");
			}
		}
	}
}

提示錯誤為引數型別不匹配,一個是int**,一個是int(*)[8]。

void showArray(int (*array)[8]) {        //可執行
	int i;
	int j;

	for(i = 0; i < MAX_COL; i++) {
		for(j = 0; j < MAX_COL; j++) {
			printf("%d ", array[i][j]);

			if(j == MAX_COL - 1) {
				printf("\n");
			}
		}
	}
}
void showArray(int array[][8]) {
	int i;
	int j;

	for(i = 0; i < MAX_COL; i++) {
		for(j = 0; j < MAX_COL; j++) {
			printf("%d ", array[i][j]);

			if(j == MAX_COL - 1) {
				printf("\n");
			}
		}
	}
}
上兩種傳參方式都可以成功傳參。