C/C++ 指標陣列和陣列指標的認識
阿新 • • 發佈:2021-06-24
指標陣列
指標陣列的理解: 指標陣列顧名思義是指標組成的陣列, 組成元素是指標變數。
字串初始化指標陣列:
#include<stdio.h> int main(void) { char *a[3] = { "hello", "world", "good" }; // 定義指標陣列a[],並對其初始化,把字串的首地址賦給它. char **p; p = a; for (int i = 0; i < 3; i++) { printf("*p: %%d = %d\n", *p); //這個輸出的是各字串的首地址. printf("*p: %%s = %s\n", *p); printf("**p: %%d = %d\n", **p); //輸出各字串首各字母h w g的 ascii碼值 printf("**p: %%c = %c\n", **p); //輸出各字串首字母 printf("*p++: %%s = %s\n", *p++); //輸出字串,%s --給它字串的首地址就好了! printf("------------\n"); } return 0; }
執行:
*p: %d = 8944628
*p: %s = hello
**p: %d = 104
**p: %c = h
*p++: %s = hello
------------
*p: %d = 8944432
*p: %s = world
**p: %d = 119
**p: %c = w
*p++: %s = world
------------
*p: %d = 8944460
*p: %s = good
**p: %d = 103
**p: %c = g
*p++: %s = good
------------
指標陣列的初始化可以分開寫:
char *a[3]; a[0] = "Hello"; a[1] = "World"; a[2] = "Good";
int 型陣列:
#include
int main(void) {
int a[3] = { 1, 2, 3 };
int **p;
int *m[3];
for (int i = 0; i < 3; i++) {
m[i] = &a[i];
p = &m[i];
printf("m[%d] = %d\n", i, **p);
}
return 0;
}
執行:
m[0] = 1
m[1] = 2
m[2] = 3
請按任意鍵繼續. . .
順便測試下二級指標。
程式碼不能寫成這樣子:
int *a[3] = { 1, 2, 3 };
這樣是錯誤的,指標變數 a 應該賦值地址給它,這樣是一個 int 常量,錯誤!
陣列指標
陣列指標就是指向陣列的指標咯!
#include
using namespace std;
int main(void) {
int *p;
int a[3] = { 3, 2, 1 };
p = a;
for (int i = 0; i < 3; i++) {
cout << 'a' << '[' << i << "] = " << *(p + i) << endl;
}
return 0;
}
執行:
a[0] = 3
a[1] = 2
a[2] = 1
請按任意鍵繼續. . .
m 個元素組成的一維陣列的指標變數——int (*p)[m]
的理解:
#include
int main() {
int a[6] = { 0, 1, 2, 3, 4, 5 };
int(*pt)[6] ;
pt = &a; // 相當於含一個一維陣列的二維陣列,這裡必須加取地址符 &,
// 可以直接寫成: int (*pt)[6] = &a; // 不能寫成 int (*pt)[6] = a;
printf("**pt = %d\n", **pt);
printf("*(*pt + 1) = %d\n", *(*pt + 1));
printf("*(*pt + 2) = %d\n", *(*pt + 2));
/* ... */
return 0;
}
執行:
**pt = 0
*(*pt + 1) = 1
*(*pt + 2) = 2
請按任意鍵繼續. . .
其實是可以這樣理解的:一對[]
等價於一個*
;所以,int(*pt)[6]
可以理解為雙重指標,它只能指向含有 6 個元素 (int) 的一位陣列,上例改為int (*pt)[8] = &a // 或者不是 8 的其他數字
。就會出錯。
#include
int main() {
int a[3][4] = { { 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 }
};
int(*p)[4], i, j;
p = a;
printf("請輸入你想要輸出元素的行和列:");
scanf_s("%d,%d", &i, &j);
printf("a[%d][%d]=%d\n", i, j, *(*(p + i) + j));
// 從第 0 行開始輸出a[i][j].
return 0;
}
``
請輸入你想要輸出元素的行和列:1,2
a[1][2] = 7
請按任意鍵繼續. . .
這裡用二維陣列就比較好理解了,指向含有 4 個元素的一維陣列。
note: 指標變數就是用來放地址的,指標變數存放的值就是地址。巨集觀講,指標就是地址地址就是指標。