本文章為本人原創,適合於剛入坑C語言,對於指針的定義和用法模糊不清的同學,如有不正,請各位指出。 從根本來說,指針變數也是變數,只是int變成了int *,以此類推。只不過指針變數裡面放的內容是普通變數在存儲空間的地址(某種奇怪的16進位地址格式,感興趣可自行百度) 定義指針變數的格式:int/do ...
本文章為本人原創,適合於剛入坑C語言,對於指針的定義和用法模糊不清的同學,如有不正,請各位指出。
從根本來說,指針變數也是變數,只是int變成了int *,以此類推。只不過指針變數裡面放的內容是普通變數在存儲空間的地址(某種奇怪的16進位地址格式,感興趣可自行百度)
定義指針變數的格式:int/double/...* studentp;
所以在給指針變數賦值的時候就應該:studentp=&student;
那麼如何通過指針來獲取student的值就可以直接:某變數=*studentp; 這裡一定不要和定義指針變數搞混!!!
函數指針和普通的指針其實一樣,無非就是把函數名給了一個函數指針變數,在獲取指針變數指向的函數的時候也是指針變數前面加一個*號
那麼有人問了,我寫的代碼以前也沒用過指針變數照樣運行,那指針變數是多此一舉的東西嗎?
必然不是的,一個很經典的問題:swap交換——如果要定義一個swap函數,交換兩個變數的值,如何實現?
有人說以下代碼就行,並沒有用到指針呀!
1 #include <stdio.h> 2 3 void swap(int a,int b); 4 int main(void) { 5 printf("小檸檬開課了!\n"); 6 7 int a=5,b=6; 8 swap(a,b); 9 printf("主函數內部a=%d,b=%d\n",a,b); 10 return 0; 11 } 12 void swap(int a,int b){ 13 int tmp; 14 tmp=a; 15 a=b; 16 b=tmp; 17 printf("swap函數內部a=%d,b=%d\n",a,b); 18 }
輸出:
答:C語言編程是面向過程的編程,面向過程就是分析出解決問題所需要的步驟,然後用函數把這些步驟一步一步實現,使用的時候一個一個依次調用就可以了。如果我需要繼續在主函數裡面用到ab交換完成的值,那麼這個函數寫的就很失敗,而且C語言返回值只能有一個,就無法使用返回的操作得到結果。
有人可能會問,為什麼我swap裡面分明讓ab交換了,結果在main函數裡面沒有用呢?
答:這個就涉及到運行機制的原理了,每一個函數都獨占一個記憶體空間,swap空間的ab和main空間的ab顯然不是同一對ab,所以無論swap怎麼折騰都不能影響main裡面的東西。
如果用到指針變數的話,那麼結果就會不一樣。
現在更改成指針變數的代碼:
1 #include <stdio.h> 2 3 void swap(int *a,int *b); 4 int main(void) { 5 printf("小檸檬開課了!\n"); 6 7 int a=5,b=6; 8 swap(&a,&b); 9 printf("主函數內部a=%d,b=%d\n",a,b); 10 return 0; 11 } 12 13 void swap(int *a,int *b){ 14 int tmp; 15 tmp=*a; 16 *a=*b; 17 *b=tmp; 18 printf("swap函數內部a=%d,b=%d\n",*a,*b); 19 }
輸出:
這裡swap的兩個形參是指針變數,用於接收main函數傳來的a(main)和b(main)的地址,swap中指針變數a(swap)和b(swap)存著a(main)和b(main)的地址,從而通過*a和*b的方式直接更改main中a(main)和b(main)的值。
這就是運用指針的好處。