多維陣列和多維指標
阿新 • • 發佈:2018-12-11
-
指向指標的指標
- 指標的本質是變數
- 指標會佔用一定的記憶體空間
- 可以定義指標的指標來儲存指標變數的地址值
int main()
{
int i = 0;
int* p = NULL;
int** p = NULL;
pp = &p;
*pp = &i;
return 0;
}
程式碼示例(功能 : 重置動態空間大小)
#include <stdio.h> #include <malloc.h> int reset(char**p, int size, int new_size) { int ret = 1; int i = 0; int len = 0; char* pt = NULL; char* tmp = NULL; char* pp = *p; if( (p != NULL) && (new_size > 0) ) { pt = (char*)malloc(new_size); tmp = pt; len = (size < new_size) ? size : new_size; for(i=0; i<len; i++) { *tmp++ = *pp++; } free(*p); *p = pt; } else { ret = 0; } return ret; } int main() { char* p = (char*)malloc(5); printf("%p\n", p); if( reset(&p, 5, 3) ) { printf("%p\n", p); } free(p); return 0; }
執行結果:
-
二維陣列與二級指標
- 二維陣列在記憶體中以一維的方式排布
- 二維陣列的第一維是一維陣列
- 二維陣列中的第二維才是具體的值
- 二維陣列的陣列名可看做常量指標
程式碼示例(功能 :遍歷二維陣列):
#include <stdio.h> #include <malloc.h> void printArray(int a[], int size) { int i = 0; printf("printArray: %d\n", sizeof(a)); for(i=0; i<size; i++) { printf("%d\n", a[i]); } } int main() { int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}}; int* p = &a[0][0]; int i = 0; int j = 0; for(i=0; i<3; i++) { for(j=0; j<3; j++) { printf("%d, ", *(*(a+i) + j)); ==> a[i][j]這裡的轉換規則在章節已經講過 } printf("\n"); } printf("\n"); printArray(p, 9); return 0; }
執行結果:
-
陣列名
-
一維陣列名代表陣列首元素的地址
int a[5]-----------------a的型別為int*
-
二維陣列名同樣代表陣列首元素的地址
int m[2][5]-------------m的型別為int(*)[5]
- 二維陣列名可看做是指向陣列的常量指標
- 二維素組可以看做是一維陣列
- 二維陣列中的每個元素都是同類型的一維素組
-
程式碼示例(功能:動態申請二維陣列):
#include <stdio.h> #include <malloc.h> int** malloc2d(int row, int col) { int** ret = NULL; if( (row > 0) && (col > 0) ) { int* p = NULL; ret = (int**)malloc(row * sizeof(int*)); p = (int*)malloc(row * col * sizeof(int)); if( (ret != NULL) && (p != NULL) ) { int i = 0; for(i=0; i<row; i++) { ret[i] = p + i * col; } } else { free(ret); free(p); ret = NULL; } } return ret; } void free2d(int** p) { if( *p != NULL ) { free(*p); } free(p); } int main() { int** a = malloc2d(3, 3); int i = 0; int j = 0; for(i=0; i<3; i++) { for(j=0; j<3; j++) { printf("%d, ", a[i][j]); } printf("\n"); } free2d(a); return 0; }
執行結果:
- C語言中只支援一維陣列
- C語言中的陣列大小必須在編譯器就作為常數確定
- C語言中的陣列元素可是任何型別的資料
- C語言中的陣列的元素可以是另一個數組