C/C++指針操作整理
面向曾經學習過指針的人,并非針對究極初學者。
一維指針
數據類型存儲的地址,指向數據存儲的地址,可以使用 &
運算符取變量的地址,將其賦給指針變量。
int a = 2;
int *p = &a;
同時因為C/C++中數組是連續存儲的,所以一個指針可以間接訪問一個數組,可以通過指針的解引用訪問該地址處存儲的值。
知識點:
- 一個數組的數組名默認代表這個數組的地址。
- 可以通過
地址加減
和下標法
訪問連續存儲的數據。
int a[4] = {1, 2, 3, 4};
int *p = a;
for (int i = 0; i < 4; ++i) {// 下面兩行代碼等價,
// std::cout << p[i] << " ";std::cout << *(p + i) << " ";
}
同樣的,對于 char
類型,也有:
char s[] = "ABCDEF";
char *p = s; // s代表字符串首地址
for (int i = 0; i < int(strlen(s)); ++i) {// std::cout << p[i];std::cout << *(p + i); // 輸出單個字符
}
std::cout << "\n";
std::cout << p << "\n"; // 輸出整個字符串
特別的:針對 char
類型,可以直接輸出首地址,編譯器會自動將地址加一往后輸出,直到遇到 \0
字符,即字符串結尾字符。(注意 string
類型沒有 \0
結尾字符)
其他數據類型基本同理。
二維指針
即指針的指針,就是指針存儲的是一個指針變量的存儲地址,輸出的時候就需要兩層解引用了。
int val = 4;
int *p1 = &val;
int **p2 = &p1;
std::cout << **p2 << "\n";
數組指針和指針數組
1 數組指針
即數組的指針,代表整個數組的地址。由于 []
優先級大于 *
, 所以需要使用 ()
代表 p
存儲一個長度為 3
的數組的地址。
int (*p)[3];
2 指針數組
即數組中存儲的是指針變量。
int *p[2];
一些指針操作
需要了解下new操作
1 創建二維動態數組
- 方法一:利用二維指針,C++ new操作
定義一個二維指針,二維指針指向的是長度為 n
的數組(數組中存儲的是指針變量)的地址,即定義 f
時就指向了一個數組的首地址,而這個數組中的每個指針元素代表了二維數組每一行的首地址。
然后利用循環,對二維指針進行操作,每維申請一個長度為 m
的數組,剛好 new
操作返回的就是一個數組的首地址,就可以賦給 f[i]
int **f = new int*[n];
for (int i = 0; i < n; ++i) {f[i] = new int[m];
}
- 方法二:利用二維指針,C malloc操作
int **f = (int**)malloc(sizeof(int*) * n);
for (int i = 0; i < n; ++i) {f[i] = (int*)malloc(sizeof(int) * m);
}
- 方法三:使用數組指針
直接定義個數組指針指向整個二維數組
int (*p)[3] = new int[2][3];
int cnt = 0;
for (int i = 0; i < 2; ++i) {for (int j = 0; j < 3; ++j) {// *(*(p + i) + j) = ++cnt;// std::cout << *(*(p + i) + j) << " \n"[j == 2];p[i][j] = ++cnt;std::cout << p[i][j] << " \n"[j == 2];}
}
- 方法四:使用C++
vector
聲明了等價于 a[n][m]
的數組
vector<vector<int>> a(n, vector<int>(m, 0));