1.指針加1?
對(duì)指針加 1 的動(dòng)作虑省,意味著要把它移到下一個(gè)單元去斗搞。它的地址值上加一個(gè) sizeof 那個(gè)指針的類型。
int a[10]; ?int *p = a; ? *(p+1) 指向 a[1] ?*(p+n) 指向 a[n]
如果指針不是指向一片連續(xù)分配的空間(如數(shù)組)慷妙,則這種運(yùn)算沒(méi)有意義僻焚。
2.指針計(jì)算
兩個(gè)指針相減得到兩個(gè)地址之間有幾個(gè)這樣類型的東西在。
3. *p++
取出 p 所指的那個(gè)數(shù)據(jù)來(lái)膝擂,完事之后順便把 p 移到下一個(gè)位置去虑啤。
* 的優(yōu)先級(jí)雖然高隙弛,但是沒(méi)有 ++ 高。
常用于數(shù)組類的連續(xù)空間操作狞山。
4.指針比較
5. 0地址
你的內(nèi)存中有 0 地址(每個(gè)程序都有 0 地址)全闷,但是 0 地址通常是個(gè)不能隨便碰的地址。所以你的指針不應(yīng)該具有 0 值萍启。
可以用 0 地址來(lái)表示特殊的事情:返回的指針是無(wú)效的总珠;指針沒(méi)有被真正初始化(先初始化為 0)。
NULL 是一個(gè)預(yù)先定義的符號(hào)勘纯,表示 0 地址局服。(有的編譯器不愿意你用 0 來(lái)表示地址)。
6.指針的類型
無(wú)論指向什么類型驳遵,所有的指針大小都是一樣的淫奔,因?yàn)槎际堑刂贰?/p>
但是指向不同類型的指針是不能互相賦值的(為了避免用錯(cuò)指針)。
7.指針的類型轉(zhuǎn)換
void* 表示不知道指向什么東西的指針(計(jì)算時(shí)與 char* 相同堤结,但不相通)唆迁。
指針也可以轉(zhuǎn)換類型: int *p = &i; ? void* q = (void*)p; ?這并沒(méi)有改變 p 所指的變量的類型,而是讓后人用不同的眼光通過(guò) q 看它所指的變量竞穷。
8.用指針來(lái)做什么
需要傳入較大的數(shù)據(jù)時(shí)用作參數(shù)唐责;
傳入數(shù)組后對(duì)數(shù)組做操作;
函數(shù)返回不止一個(gè)結(jié)果(需要用函數(shù)修改不止一個(gè)變量)瘾带;
動(dòng)態(tài)申請(qǐng)內(nèi)存妒蔚。
9. malloc 和 free
如果申請(qǐng)失敗則返回 0 (NULL)。
錯(cuò)誤用法: ? ?p = &i; ? free(p);
良好的習(xí)慣是月弛,有一個(gè)指針出來(lái)了,先初始化為 0 科盛。void *p = 0; free(p);