什么是指針?
在計算機中,所有的數(shù)據(jù)都是存放在存儲器中的。一般把存儲器中的一個字節(jié)稱為一個內(nèi)存單元,不同的數(shù)據(jù)類型所占用的內(nèi)存單元數(shù)不等,如整型量占 4 個單元,字符量占 1 個單元等。為了正確地訪問這些內(nèi)存單元,必須為每個內(nèi)存單元編上號。根據(jù)一個內(nèi)存單元的編號即可準確地找到該內(nèi)存單元,內(nèi)存單元的編號也叫做地址。既然根據(jù)內(nèi)存單元的編號或地址就可以找到所需的內(nèi)存單元,所以通常也把這個地址稱為指針。
可以用一個通俗的例子來說明它們之間的關(guān)系:
?我們到銀行去存取款時, 銀行工作人員將根據(jù)我們的帳號去找我們的存款單, 找到之后在存單上寫入存款、取款的金額。在這里,帳號就是存單的指針, 存款數(shù)是存單的內(nèi)容。對于一個內(nèi)存單元來說,單元的地址即為指針,其中存放的數(shù)據(jù)才是該單元的內(nèi)容。
什么是指針變量?
?在C語言中,允許用一個變量來存放指針,這種變量稱為指針變量。一個指針變量的值就是:某個內(nèi)存單元的地址或稱為某內(nèi)存單元的指針。變量的指針就是變量的地址。存放變量地址的變量是指針變量。
訪問變量的兩種方式
通過變量名直接訪問
在同一作用域內(nèi),變量名是唯一的,不允許出現(xiàn)兩個變量名相同的變量,這個變量名就和變量的地址一一對應。也可以這么理解:變量名就是變量的地址。這種通過變量名訪問變量的方式就稱為直接訪問。
通過指針變量間接訪問
?我們可以先取出指針變量的值(由定義可以知道,指針變量的值就是某一變量的地址),然后再根據(jù)這個地址來訪問對應的變量,這種訪問方式就稱為間接訪問。
指針變量的表示方式
對指針變量的定義包括三個內(nèi)容:
- 指針類型說明(基類型);
- 指針變量標識符
*; - 指針變量名;
在 C 語言中,我們會使用 * 來標注指針變量,使用的場景不同,* 表示的意思也不同??慈缦麓a:
int main(void)
{
int a = 10;
// 定義指針變量 p 時使用 *,*表示變量p時指針變量
int * p = &a;
// 這時候使用 * ,表示“指向”,取出指針變量p指向的值,也就是a的值
printf("%d\n",*p);
return 0;
}
為什么指針變量必須要指定基類型?
有同學可能會有這樣的疑問:既然指針變量中存儲的是地址,地址在內(nèi)存中又是唯一的,同一時刻不可能有兩個變量占用同一地址,那么為什么要添加基類型呢?存入地址不就夠了嗎?
要知道,不同的數(shù)據(jù)類型在內(nèi)存中占用的字節(jié)數(shù)量和存儲方式是不一樣的,比如 int 占用 4 字節(jié),而 char 就只占用 1 字節(jié);必須知道數(shù)據(jù)類型,才能夠按照存儲單元的長度和存儲形式正確的取出該數(shù)據(jù)。比如:定義一個 int 型的變量,假設(shè)它占用的內(nèi)存單元為 2000~2004 ,那么它的地址就為 2000,系統(tǒng)需要將后邊 3 個單元的數(shù)據(jù)取出,就需要知道它是指向 int 類型的指針變量。
所以,我們可以得出這樣一個結(jié)論:一個指針變量包括兩個方面:一是以存儲單元編號表示的地址,一是它指向存儲單元的數(shù)據(jù)類型。
指針變量的簡單使用
-
*為取值符(或者可以稱 “間接訪問符”),從一個指針變量中取出指針指向的變量的值; -
&為取地址符,用來取出一個變量的地址;
看例碼:
int main(void)
{
int a = 10;
// 取變量a的地址賦值給指針變量p
int *p = &a;
// 從指針變量p中取出a的值賦給b
int b = *p;
return 0;
}