昨天,寫了一些關於一級指針的看法,那麼此次咱們再來看看二級指針的一些用法,也能夠說是我本身的一些看法
所謂二級指針其實和一級指針差很少,一級指針是存儲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");void
}
咱們能夠發現一級指針取地址能夠賦給二級指針,因而二級指針就誕生了;
那麼咱們來看看這段程序是如何運行的,其實這個昨天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沒有半毛錢關係;
這個就是我對二級指針的看法;關於如何向一級指針所指的空間中賦值,我會在之後的隨筆中發表個人見解;