1. 程式人生 > >關於一級指標和二級指標的部分理解(I)

關於一級指標和二級指標的部分理解(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的時候還忙了其他事情,很多事情都忘記了。所以,下次還有更深的理解,回來繼續補充。