c++學習筆記系列:http://blog.csdn.net/column/details/17301.html
1、聲明指針
如果聲明多個指針,每個都必須加*,如int *aPtr, *bPtr變量名最好以Ptr結尾,表明是指針變量
把指針初始化NULL和0是等價的
2、地址運算符和間接運算符
地址運算符&:返回操作數地址。如aPtr = &a。
注意賦值語句中的&和引用變量聲明中的&用法不一樣。
賦值運算符不能出現在左側,因爲左側不能是常量。而且出現在右側時,左側必須是指針變量。如&b = a和int b = &a都是錯誤的。
如果aPtr = &a,那麼*aPtr就是a。*aPtr = 1等價於a = 1。
間接運算符*必須修飾指針變量,否則編譯報錯。
3、指針參數
指針參數的使用:函數原型void init(int *),函數void init(int *aPtr)。使用函數時必須傳入指針,如init(&a)。但是數組可以不必加&,直接傳入即可。
4、sizeof
返回的是字節數。sizeof是一個運算符,不是函數。當後面是類型時,必須有括號,sizeof(int)
當後面是變量是,可以沒有括號,sizeof a
但是爲了防止錯誤,最好全部使用括號。
5、指針運算
可以進行加減、自增、自減。但是並不是單純的在地址上加減,而是需要乘上指針對應元素的大小。比如數組中一個元素是4個字節,指針加1實際上就是地址加4,其實就是移動到下一個元素。
所以指針的運算就是相對元素的地址偏移,在同一組元素中,指針運算纔有意義。
6、數組和指針
int a[10];數組名可以直接當指針使用,*(a + 3)等價於a[3],但是數組名是常量,不能進行自增自減,a+=3會報錯。
指針也可以帶下標使用,如aPtr=&a,aPtr[1]等價於a[1]。
7、函數指針
函數bool a(int x, int y) 做函數指針在函數原型中void b(int, bool ()(int, int)),在函數定義中void b(int x, bool (*y)(int, int))。
使用時(*y)(1, 2),注意*y必須有括號,也可以寫成y(1, 2),但是不推薦這麼寫。
8、函數指針數組
三個函數a,b,c都是void a(int)型的聲明指針數組 void (*f[3])(int)={a, b, c}
使用方式(*f[0])(5),就是調用a(5)方法。
9、字符串函數cstring
(1)注意strtok函數(字符串分割)會修改傳入的字符串,所以如果不想被修改,需要傳一個拷貝。(2)使用strcat\strncat\strcopy\strncopy等函數注意,這些函數的操作結果會放入第一個參數,所以作爲第一個參數的字符數組長度必須保證,否則報錯。
如:int a[]="ab";
int b[]="cd";
strcat(a, b)會出錯,因爲a初始化後長度爲3,拼接後長度超過了。可以修改爲int a[10]="ab"。
(3)在VS中,由於上述的方法不安全,所以使用會報錯。用對應的xxx_s方法代替即可。如strcst_s