一、指針的四個關鍵概念
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語言其實只有一種傳值方式,就是按值傳遞
按值、按址傳遞的區別在於,在函數中使用的方式而已。如果在函數中是要修改地址所指向內存的值,則可以修改實參地址指向的內容。因為在內存中內存地址是唯一的,所以不論在什么地方,都可以通過地址來修改內存中的值
指針變量總結