c中指針的指針(c中指針是什么意思)

今天我們來介紹一下C語言中非常有趣的部分:指針(pointer)。指針是C語言提供的一種非常有趣又有用的特性,沒有指針,就沒法動態分配內存,無法進行函數的回調,很多高級的編程技巧都無法達成。所以指針是C語言學習中非常重要的內容。江湖上總有傳言指針復雜難學,但其實它真的很簡單,啥?不信!不信咱就騎驢看唱本-走著瞧唄,嘿嘿~

指針是個啥?

在正式介紹指針之前,我們先來回顧一下C語言程序的數據是如何存放的。先來看一段代碼

includeintmain(){intivar =10;// 聲明一個整數型變量,名稱為"ivar",其值是10return0; }

上面的代碼中,我們聲明了一個整數型的變量ivar并給它賦值為10。如果我們把變量看成是可以裝入數據的小盒子,那么現在我們就制造了一個小盒子,給它貼上了個名字ivar,然后在里面放上了數據:整數10。

以上變量和數據在內存中是如何存放的呢?我們知道,所謂程序是由計算機(更準確點說是操作系統)加載其進內存后執行的,計算機會為程序分配一個內存空間用來存放程序編譯后的代碼指令以及程序中用到的數據。對于上面這段程序,計算機會在內存中分配一個內存空間用來存放整數(一般是4字節長度),并給這個空間起個名字叫ivar。當我們給`ivar`賦值的時候,所賦的值就存入到這個內存空間中。這就是變量和變量的數據在內存中實際存放的形態。

因為內存是有編號的,所以我們在示意圖上加上內存的編號

內存編號我們也稱之為內存地址,通常使用一個16進制的整數來表示。比如上面例子中的內存地址就是16進制整數61fe14

既然內存地址也是個整數,那么如果有個小盒子(變量)存放這個內存地址,那我們就可以隨時通過這個小盒子里的地址找到相應的內存塊,取得里面的數據或是改變里面的數據了。這個用來存放內存地址的變量我們稱之為指針

如上圖所示,我們用一個變量`pvar`保存變量`ivar`的內存地址`0x61fe14`,則變量`pvar`就是一個指針,準確得說是一個指針變量

我們知道了什么是指針,那怎么用代碼實現呢?來,上代碼

includeintmain(){intivar =10;int*pvar; pvar = &ivar;printf("pvar存儲的內存地址是:%p\npvar指向的內存中的值是:%d\n", pvar, *pvar);return0; }

編譯運行上面的代碼,我們將得到類似下面的結果

pvar存儲的內存地址是:000000000061FE14 pvar指向的內存中的值是:10

代碼中有一行特別的變量聲明:

int*pvar;

這里就是聲明一個能指向整數的指針變量,變量名是pvar

pvar =&ivar;

這行代碼意思是將變量`ivar`的內存地址取到,賦值給指針變量`pvar`。符號**`&`**在這里是**取地址運算符**,即將變量`ivar`所對應的內存地址取出來。

當我們想要通過指針操作它指向的內存塊中的數據時,要怎么做呢?來看這一行代碼

printf("pvar存儲的內存地址是:%p\npvar指向的內存中的值是:%d\n", pvar, *pvar);

沒錯,我們又使用了符號`*`,這次`*`充當了間接運算符的角色,和指針變量結合起來就相當于得到了指針變量所指向的內存塊的操作權,`*pvar`可以取得`pvar`所指向內存塊中的值。那有同學要問了:是不是只能取值?如果我想改變指針指向內存塊中的值要怎么做呢?很簡單,還是利用間接操作符`*`來完成,像這樣:

*pvar=20;

這樣就可以將pvar所指向的內存塊中的值修改成20了。發現沒有,因為pvar是指向變量ivar的地址的,我們可以將*pvar等同ivar。對*pvar的操作效果與直接操作變量ivar是一樣的。

以上,就是指針最基礎的概念和操作啦!是不是很簡單?不過如同圍棋一樣,往往規則越是簡單,變化越是多端。指針本身不復雜,但江湖上流傳著許多指針的武林秘籍,招式多變,威力驚人!在后面的學習中,我們將逐步提升功力,將指針高級招式悉數掌握,方能在C語言的江湖上游走自如,成為一代大俠!

轉載注明出處:華峰博客網

內容版權聲明:除非注明,否則皆為本站原創文章。