時間:2019-08-10 15:24:30 作者:Dorise 瀏覽量:99
什么是 C言語指針?

圖一 怎樣了解C言語中的指針,怎樣運用
不同的數據類型的主要差異在于占用的存儲空間不同。咱們知道,C 程序是運轉在計算機的內存中的,因而 C 程序的變量也是存在于內存中的。C 標準規則 char 類型占用一個字節的存儲空間,對其他整型卻沒有做規則,現在為了解說的便利,咱們假定 int 類型的數據占用內存 4 個字節。
假定咱們如下界說了兩個變量:
signed char i = 3;int j = 8;
那么,i 占用了 1 字節的內存空間,j 占用了 4 字節的內存空間,方框表示內存空間,內部表示存儲的值。咱們把內存逐字節編號,方框外部的數字表示方框的編號(這樣的內存“編號”即所謂的“內存地址”)。修正變量 i 的值,實際上便是修正地址為 4000 的內存空間里的值。那反過來呢?假如我修正了地址為 4000 的內存空間里的值,i 的值會相應改變嗎?答案是肯定的,請持續往下看,內存地址“4000”是我為了解說便利隨意取的。那么,在實際應用中,變量 i 的地址怎樣獲取呢?C 言語供給了“&”運算符,便是獲取變量地址的。請看下面的例子:
#include
int main()
{
signed char i = 3;
int j = 8;
long p1 = (long)&i;
printf(\\\"p1: %ld \\\",p1);
return 0;
}
咱們取出了 i 的地址,把它強制轉換為 long 型(關于強制類型轉換,可參閱上一節),傳遞給 p1 了。編譯履行,發現變量 i 的地址被打印出來了。這說明,C 程序變量的地址也是一個整數。
依照上面的說法,修正 i 的值除了直接對 i 賦值以外,還能夠經過修正 p1 地址處的內存空間里的數值。那,怎樣才能“經過修正 p1 地址處的內存空間里的數值”修正 i 的值呢?
上面的代碼實例中,咱們運用了 long 型變量 p1 存儲了 i 的地址。事實上,C 言語有專門的數據類型存儲地址,界說方式也很簡單,便是:“類型描述符 * ”,例如,能夠界說以下變量存儲地址:
signed char *p1 = &i;int *p2 = &j;
p1 和 p2 便是 C 言語中所謂的指針類型,由于 i 是 signed char 類型的,所以界說了 signed char * 類型的指針存儲 i 的地址。j 是 int 類型的,所以界說了 int * 類型的指針存儲 j 的地址。別的,C 言語供給了“&”運算符取變量地址,與之對應的,還供給了“ * ”運算符從相應地址內存里取出數值。
好了,了解了 C 言語的指針類型和“ * ”運算符,現在來看看怎樣“經過修正 p1 地址處的內存空間里的數值”修正 i 的值。請看如下代碼:
signed char *p1 = &i;
*p1 = 5;
printf(\\\"i=%d \\\",i);
編譯運轉,發現程序輸出“i=5”,這樣咱們就完成了“經過修正 p1 地址處的內存空間里的數值”修正 i 的值。
在界說變量時,” * “放在變量符號前,能夠界說指針變量。在界說完指針變量后,“ * ”放在變量前,就表示從地址取值的運算符了。別的,“ * ”還能夠表示乘法運算符,讀者自己思考什么情況下,“ * ”表示乘法運算符。
以上的操作,實際上便是 C 言語的指針操作,能夠看出它一點也不奧秘,接下來幾節,咱們將持續討論 C 言語的指針,比方為什么 int 類型的變量 j 的地址要運用 int* p2; 界說,而不能運用 signed char* p2; 界說,運用指針為何能寫出緊湊、高效的 C 程序等等。
為什么要運用指針?
在開始討論為什么運用 C 言語指針之前,先介紹一下復雜點的指針,這是新知識,也是襯托。不想看襯托能夠往后翻一翻。
前面幾節介紹了 C 言語中指針,也討論了數組指針和指針數組的差異,但歸根結底,至今咱們說的都是根底數據類型界說的指針,C 言語有復合數據類型,那么它有復合數據類型的指針嗎?答案是肯定的,事實上,在 C 言語中復合類型指針的運用相當廣泛。