談到指針,我們可能會想到鍾表上的指針,但這里的指針不是現實生活中看得見摸得着的鍾表上的指針,c 語言中的指針只存在於邏輯思維中,物理上並不存在。
同時,指針也是C 語言中最精華的部分,通過靈活地運用指針,可以寫出獨具匠心、構思巧妙的程序。
指針基礎
c 語言中指針的實質就是地址
內存地址
對於計算機中的內存,都會以字節為單位,逐一地編上號碼,這個編號就是內存的地址,如下圖:
圖中,按字節給內存依次編上了號碼,其中每個數字對應着1字節的內存空間,而數字就是內存的地址。
取地址運算符"&"
C 語言中,可以用"&"符號來獲取一個變量的內存地址。只要在變量名前加上"&"符號就可以獲取變量名所表示的內存地址。當獲取到變量的內存地址后,就相當於得到了一個指向該變量的指針。簡單的總結一下:
&變量名 == 該變量的內存地址 == 指向該變量的指針
解引用運算符“*”
既然可以通過取地址符獲取一個指向變量的指針。那怎么通過這個指針再找回原來的變量呢?
這時候就有了一個和取地址相逆的操作,我們把它稱為解引用,解引用需要用到星號“ * ” ,它的使用格式為:
*指針
另外,C 語言中,還允許定義專門用於存儲內存地址類型的變量,我們將其稱為地址變量,又被稱為指針變量。
指針、指針變量與內存地址小區分
首先內存地址是內存單元的一個編號,可以把它當成一個常量看待;指針變量是一個能夠存放內存地址的容器,它是一個變量;指針是無形的,我們可以把它想象成一個帶箭頭的長線,線尾連着指針變量,而箭頭指向了指針變量所保存的內存地址處的數據。
指針進階淺談
由於指針學起來涉及的內容比較多,難度相比其他的也較大,所以下面我只是簡單的談一談指針變量、指針與數組,指針與字符串、指針與函數、二級指針,權且當做給大家提個醒,理一理邏輯,要具體學習還得自己再編程實戰中去體悟。
1,指針變量
指針變量也是變量的一種,但它與普通變量有所不同,普通變量存儲的是數據,指針變量存儲的是內存地址。
//指針變量的定義格式
數據類型 *變量名;
定義指針變量后,不要直接去使用,因為使用賦予確定內存地址的"野指針"可能會出大問題。
2,指針與數組
C 語言中,數組名所對應的值就是第一個數組元素的內存地址,即可以把數組名看為指向數組首元素的指針。通過下面代碼片段理解:
int a[3]={10,20,30};
printf("The first element value: %d\n",*a); //輸出為:The first element value: 10
還有什么很多諸如數組指針,指針數組等等各種定義,我覺得單純的記他們沒有什么必要,本身用的就不多,就算到了用的時候,直接問問”度娘“就ok 了
3,指針與字符串
字符串是常量,常量是C 語言中最簡單的表達式,而所有的表達式都是有值的,那字符串常量的值是什么呢?字符串常量的值就是字符串中首字符的內存地址。例如 apple 這個字符串常量的值就是第一個字符 a 的內存地址。因此我們可以用一個char 類型的指針來指向這個字符串。
char *ptr = "apple";
4,指針與函數
函數時擁有特定功能的語句的集合,是構成程序的基本模塊。在函數的定義過程中,可以將指針作為函數的參數,也可以將指針作為函數的返回值,甚至可以用指針來指向一個函數。
限於篇幅限制,這里就簡單的提示一下,具體的區別或找一些具體例子來體會,大家很容易在網上搜集到的~ ~。
5,二級指針
所謂的二級指針就是指向指針的指針。其定義格式如下:
數據類型 **變量名
指針的實質就是內存地址,由於指針變量是可以存儲內存地址的變量,因此也可將其視作指針。而指針變量本身也是變量,需要占用內存空間,因此也有內存地址。如果將這個內存地址在存儲到另一個指針變量中,就形成了一個指向指針的指針,即指向指針的指針就是二級指針。
定義好二級指針后就需要對它進行初始化與賦值了
int a = 10; //定義一個int 類型的變量a,並初始化為10
int *pi = &a; //定義一個int 類型的指針變量pi,並初始化其值為a 的內存地址
有了指針變量pi ,下面就可以定義一個二級指針並對其進行初始化了,如下:
int **ppi = π //定義二級指針ppi,並通過取地址符獲取指針變量pi 的內存地址,將其初始化給二級指針ppi
6,特殊指針
指針是C 語言的精髓和靈魂。其中有兩種相對特殊的指針,一個是空指針,另一個是void 類型的指針。
int *pi=NULL; //空指針
void *pv; //void類型的指針,任何類型的指針都可以被隱式地轉換為void類型的指針。因此,它通常作為函數的參數出現。