關於一級指標和二級指標的部分理解(I)
時間:2/15/2013
在複習一個演算法:老鼠走迷宮I 的時候,用到了一個列印迷宮的函式,因為迷宮用一個二維陣列來表示,但可能以後在應用中,並不知道二維陣列的大小,所以想使用指標的方式來遍歷陣列。 實際在C++中用 迭代器 應該會更好一點把?還沒試過,相信有這東西。不過既然忘記了,就只能自己想辦法解決這個問題唄。
#include <stdio.h> void printMaze(int *maze, int mazeWidth, int mazeHeight) { int mazeSize = 0; mazeSize = mazeWidth * mazeHeight; for (int i = 0; i < mazeSize; ++i) { if ( (i%mazeWidth) == 0) { printf ("\n"); } if ( *maze == 2 ) { printf ("X"); } else if ( *maze == 1 ) { printf ("o"); } else { printf ("."); } maze++; } printf ("\n\n"); } int main() { //初始化迷宮,用2來表示牆壁、1表示路徑 int maze[9][9] = { {2, 2, 2, 2, 2, 2, 2, 2, 2}, {2, 0, 0, 2, 0, 2, 0, 0, 2},//起點位置(1,1) {2, 0, 2, 0, 0, 0, 0, 2, 2}, {2, 0, 0, 0, 2, 2, 0, 0, 2}, {2, 2, 2, 0, 0, 0, 2, 0, 2}, {2, 0, 0, 0, 2, 0, 2, 0, 2}, {2, 2, 2, 2, 0, 2, 0, 0, 2}, {2, 0, 0, 0, 0, 0, 0, 2, 2},//終點位置(1, 7) {2, 2, 2, 2, 2, 2, 2, 2, 2}, }; printMaze(&(maze[0][0]), 9, 9); return 1; }
將二維陣列的首地址傳送過去,這會是一個使用指標來遍歷二維陣列的一個比較好的例子,記下來。
又或者是通過強制轉換成二級指標的方式:
#include <stdio.h>
void print(int **show)
{
for (int i = 0; i < 4; ++i)
{
printf ("%d", *show);
show++;
}
}
int main()
{
int a[2][2] = {4, 3, 2, 1};
print((int**)a);
return 1;
}
這個例子會有些許難理解,不管是多少維的陣列,都可以看作是一維陣列,而一維陣列本身也可以當作是 一級指標。
以後在回過頭來看這個,從下面的例子來看,因為貌似在轉換的過程中二級退化成了一級指標一樣。誰來解答一下?
#include <stdio.h> void print(int **show) { /*for (int i = 0; i < 4; ++i) { printf ("%d", *show); show++; }*/ printf ("show----- %d\n", show); printf ("&show----- %d\n", &show); printf ("*show----- %d\n", *show); printf ("**show----- %d\n", **show); } int main() { int a[2][2] = {4, 3, 2, 1}; printf ("a[0[0]----%d\n", &a[0][0]); printf ("a----%d\n", (int**)a); print((int**)a); return 1; }
首先是指標。 //這裡就不玩文字遊戲了,什麼指向變數的指標、指向指標變數的指標。
先從一級指標開始:
雖然不知道暫存器是什麼東西。不過感覺在 C/C++中,每一個變數就是存放在 一個個暫存器中。 可以想象成是一個容器。//目前個人理解哈=。=
比如一個int型別的變數, int a = 1; 這個變數a 就被隨機儲存在一個 int 型別的 容器 中,而這個 容器 的內容是1。 每個容器都有一個名字,這裡就是所謂的 地址。
一級指標,實際上就是 儲存地址 的一個變數(容器)。裡面的內容就是 一串地址。
比如: int *p = NULL;
int a = 1;
p = &a;
首先申明一個 int型別的指標變數, 然後把 變數a 的地址儲存在 指標變數p 裡面。
按照上面所說的意思,就是 p這個容器裡面儲存的是 a這個容器的名字, 而 a容器裡面儲存的就是1;
單獨使用 p ,就是一串地址,在這裡就是 a的地址,而通過“ * ”號既 *p 則可以直接訪問到 a裡面的內容。
=。= 感覺這樣說比較複雜。。有點暈··· 以後更深的理解,在回過頭來整理一下把。
所謂的一級指標, 就是 儲存 變數地址 的 指標變數,如 int a = 1; int *p = &a;
而 二級指標, 就是 儲存 指標變數地址 的指標變數, 如 int *q = &p;
按照剛剛的邏輯,還是自己畫個圖傳上來好了,藝術細胞死光光唉~···
以上結論可以通過 以下簡單的程式碼 來得出。
#include <stdio.h>
int main()
{
int a = 5;
int *p = &a;
int **q = &p;
printf ("a ---- %d\n", a);
printf ("&a---- %d\n\n", &a);
printf ("p----- %d\n", p);
printf ("&p---- %d\n", &p);
printf ("*p---- %d\n\n", *p);
printf ("q----- %d\n", q);
printf ("&q---- %d\n", &q);
printf ("*q---- %d\n", *q);
printf ("*qq--- %d\n\n", **q);
return 1;
}
這只是指標皮毛中的皮毛中的皮毛。。
因為發表這BLOG的時候還忙了其他事情,很多事情都忘記了。所以,下次還有更深的理解,回來繼續補充。