昨天,寫了一些關於一級指針的見解,那么這次我們再來看看二級指針的一些用法,也可以說是我自己的一些見解
所謂二級指針其實和一級指針差不多,一級指針是存儲0級指針地址的變量,(一定要記住這一點:指針也是變量,編譯器會給它分配內存空間,它的內存空間和它指向的內存空間是不同的,它的內存空間里只能存儲空間地址;)所以二級指針就是儲存一級指針地址的變量,或者說二級指針是指向一級指針空間的變量;還可以說是指向一級指針的指針;
那么下面我們來看代碼:
void changePointer(char **c)
{
*c = 100;//這個改變的是a地址的指向,而不是在其空間上賦值,因為此時還沒有為a分配空間,或者說這個空間只能讀不能寫入,這個空間連void 類型都算不上;我個人是這么理解的
//想要改變a所指向空間的數值的話需要,為其分配內存空間,然后通過指針改變;即是通過 c[x][y] 或者直接操作內存塊 *c來改變,但是一定要分配有內存空間
}
void changePointer_2(char *d)
{
d = 200;//在這里改變的是d指向的地址,和a無關
}
void main()
{
char *a = NULL;
char **b = NULL;
b = &a;//如同基本數據類型取地址可賦給一級指針;所以一級指針取地址可以賦給二級指針
//倘若想改變a 指向的地址 可以通過*b來改變
*b = 0x111;//當然也可以直接改變 a = 0xaaa//這里我用的是vs2010 它的地址格式好像就是這樣的 也可以直接取數值比如兩個函數那樣
//然后我們通過函數來改變地址
changePointer(&a);
printf("%d\n",a);//打印出地址為100
//這個時候肯定會有人想用一級指針改變地址,那么我們來實驗一下
changePointer_2(a);//因為是一級指針,就像是基本變量之間的數值傳遞不用取地址;就像是int a; int b; a = b;一樣
printf("%d\n",a);//我們發現打印出的地址還是100
//這個地址並沒有隨着d的變化而變化
system("pause");
}
我們可以發現一級指針取地址可以賦給二級指針,於是二級指針就誕生了;
那么我們來看看這段程序是如何運行的,其實這個昨天0級指針到一級指針的運行差不多:
首先main()函數 a 和 b 都入棧;然后運行到changePointer(&a)時,將地址傳遞過去,子函數changePointer開辟新的棧空間,二級指針c入棧,這時候c指向的是main函數中a的地址,它操作的就是a變量的空間,所以它可以直接改變指針a 的指向;所以說函數運行完被析構掉之后(c也被析構掉),但是已經通過c改變a 的地址
然后運行到changePointer_2(a),這時將地址傳遞過去,這時候d入棧,d指向a的空間;這里只是單純的指向a 的地址,不可以像二級指針那樣可以改變a指向的空間;由於他們是不同的變量,所以改變d的指向后,完全不會改變a的指向(就像int a 把數值賦給int b一樣,改變b的值不會影響a 的數值),也就是說就算你把 d 的地址指向改變的天翻地覆,也和a沒有半毛錢關系;
這個就是我對二級指針的見解;關於如何向一級指針所指的空間中賦值,我會在以后的隨筆中發表我的看法;