- 指針的本質是變量
- 指針會佔用必定的內存空間
- 能夠定義指針的指針來保存指針變量的地址
void code() { int i = 0; int* p = NULL; int** pp = 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); // 1. new_size 內存申請 tmp = pt; len = (size < new_size) ? size : new_size; for(i=0; i<len; i++) // 2. 原始值拷貝 { *tmp++ = *pp++; } free(*p); // 3. 釋放原始內存 *p = pt; // 4. 重置指針,改變指針的指向 } 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; }
輸出: 0x933f008 0x933f018
- 二維數組在內存中以一維的方式排布
- 二維數組中的第一維是一維數組【概念上】
- 二維數組中的第二維纔是具體的值
- 二維數組的數組名可看做常量指針
#include <stdio.h> #include <malloc.h> void printArray(int a[], int size) { int i = 0; printf("printfArray: %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) ==> a[i], *(a[i] + j) ==> a[i][j] } printf("\n"); } printf("\n"); printArray(p, 9); return 0; }
輸出: 0, 1, 2, 3, 4, 5, 6, 7, 8, printfArray: 4 0 1 2 3 4 5 6 7 8
- 一維數組名錶明數組首元素的地址
int a5
a 的類型爲 int*- 二維數組一樣表明數組首元素的地址
int m[2][5]
m 的類型爲 int(*)[5]
結論:spa
#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++) { *(*(a + i) + j) = i * 3 + j; } } for(i=0; i<3; i++) { for(j=0; j<3; j++) { printf("%d, ", a[i][j]); } printf("\n"); } free2d(a); }
輸出: 0, 1, 2, 3, 4, 5, 6, 7, 8,
- C 語言中只支持一維數組
- C 語言中的數組大小必須在編譯期就做爲常數肯定
- C 語言中的數組元素能夠是任意類型的數組
- C 語言中的數組元素能夠是另外一個數組
補充:二維數組可理解爲矩陣,實質在內存中是一維數組線性排列。
指針
int a[i][j]; a : 指向第 0 行數組地址 a + i : 指向第 i 行數組地址 *(a + i) ==> a[i] : 指向第 i 行首元素地址 *(a + i)+j ==> &a[i][j] : 指向第 i 行,第 j 列元素地址 *(*(a + i) + j) ==> a[i][j] : 第 i 行, 第 j 列的元素
以上內容參考狄泰軟件學院系列課程,請你們保護原創!code