c++學習筆記之指針

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。
間接運算符*必須修飾指針變量,否則編譯報錯

&和*互爲反運算,一起使用彼此抵消。&*aPtr等價於aPtr。

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

發佈了106 篇原創文章 · 獲贊 30 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章