一、指針的四個關鍵概念1、指針的類型2、指針指向的類型3、指針的值,也就是指針指向的地址4、指針自己所占用的記憶體空間註意:指針變數所存的內容就是記憶體的地址編號!例如:int **pp = NULL;1、指針的類型是 int **2、指針指向的類型 int *3、指針的值為NULL4、指針自己所站記憶體 ...
一、指針的四個關鍵概念
1、指針的類型
2、指針指向的類型
3、指針的值,也就是指針指向的地址
4、指針自己所占用的記憶體空間
註意:指針變數所存的內容就是記憶體的地址編號!
例如:
int **pp = NULL;
1、指針的類型是 int **
2、指針指向的類型 int *
3、指針的值為NULL
4、指針自己所站記憶體的大小 sizeof(pp)
二、強制類型轉換
強制類型不會改變記憶體中二進位的排列與順序,只會將二進位按照目標類型解釋。
例如:
int i = 10;
二進位位 0110;
float f = (float)i;
變數f的二進位還是 0110
三、關於CONST修飾變數
看const修飾變數的時候,完全可以將數據類型名視而不見
例如
int const *p; //修飾*p , p可以變 , *p不能夠變
const int *p; //修飾*p , p可以變 , *p不能夠變
const int * const p; //修飾p和*p , p不可變, *p也不可變
四、關於變數類型
1、數據類型的本質是固定記憶體空間大小的別名
2、變數的本質是一段連續記憶體空間起始地址的別名
五、關於變數聲明的意義
1、建立變數符號表
通過聲明變數,編譯器可以建立變數符號表,如此一來,程式中用到了多少變數,每個變數的類型是什麼,編譯器非常清楚,是否使用了沒有聲明的變數,編譯器在編譯期間就可以發現。從而幫助開發人員遠離由於疏忽而將變數名寫錯的情況
2、變數的數據類型指示系統為變數分配多少記憶體空間
3、變數的數據類型指示了系統如何解釋存儲空間中的值,同樣的數值,不同的類型將有不同的解釋。int占據4個位元組,float也占據4個位元組,在記憶體中同樣是存儲的二進位數,並且這個二進位數也沒有標誌區分當前是int型還是float型。如何區分?就是通過變數的數據類型來區分。由於聲明建立了變數符號表,所以系統知道變數該如何解釋
4、變數的數據類型確定了該變數的取值範圍
例如短整型數據取值-32767~32767之間
5、不同的數據類型有不同的操作
如整數可以求餘。C語言用符號”%”表示求餘。整數可以,實數不可
六、關於函數調用傳遞指針的總結
1、如果在被調函數中想修改主調函數中變數的值,則需要將主調函數中的變數的地址(指針)傳遞到被調函數中
2、如果主調函數要傳遞一個超大的數據到被調函數中時,也可以將主調函數的變數的地址(指針)傳遞到被調函數中,這樣有利於提高程式的性能
3、傳遞N級指針是為了修改N-1級指針的值,
例如 : int *p;如果需要修改p的值,則需要將&p傳遞到函數中,才能修改p的值
七、關於指針與數組互換的問題
在表達式中,指針和數組是可以互換的,因為他們在編譯器裡面的最終形式都是指針,並且都可以進行取下標操作
八、數組與指針的區別
數組: 一個數組就是一個地址,並且該地址是一個常量值,不能改變。因此,數組名不能作為左值。
指針: 一個指針就是一個地址的地址 , 並且該地址是可以改變的。也就可以作為左值。
九、指針與地址的區別
指針就是地址,但地址並不是指針。指針有類型,地址沒有類型。
十、傳值與傳址的區別
c語言其實只有一種傳值方式,就是按值傳遞
按值、按址傳遞的區別在於,在函數中使用的方式而已。如果在函數中是要修改地址所指向記憶體的值,則可以修改實參地址指向的內容。因為在記憶體中記憶體地址是唯一的,所以不論在什麼地方,都可以通過地址來修改記憶體中的值
指針變數總結