指針
&:求址符。
*:求值符。
&i:表示變量i的內(nèi)存地址。
*p:表示指針變量指向內(nèi)存的值。
*p=100:表示把100賦值給指針p指向的內(nèi)存空間。
指針只能存放地址。
int *p=NULL是允許的,表示指向地址為0的內(nèi)存區(qū)域,該區(qū)域是不能操作的。我們稱這樣的指針為空指針,意味著該指針不指向任何變量。
野指針:沒有賦初值,也稱之為懸空指針。野指針很難控制的,因為你不知道它會指向哪個地址空間,所以要初始化。賦NUll也可以,這樣就成了空指針。
用戶進程之間不能互相訪問對方的內(nèi)存空間。
內(nèi)核進程之間的內(nèi)存是可以互相自由的訪問。
void *p:表示無類型指針??梢越邮苋魏晤愋蛿?shù)據(jù)的地址,也可以將自己賦給任何數(shù)據(jù)類型的指針(在C語言中可以,在C++中是非法的,必須要轉(zhuǎn)類型)。同時void也意味著讀取的長度不確定。無法讀取一個數(shù)據(jù)。
指針與數(shù)組
數(shù)組名代表數(shù)組的首地址。
地址用8位十六進制數(shù)表示(8/2=4),因為指針是存放別人的地址,所以指針的大小應該是四個字節(jié)。
無論是int 類型的指針,還是char類型的指針,它們都在內(nèi)存中占4個字節(jié),類型只是決定了它們指向的數(shù)據(jù)類型和讀取的長度。
&數(shù)組名表示數(shù)組的首地址,同數(shù)組名一樣。
指針的運算并不是拿地址進行運算,而是指針在內(nèi)存中的移動。
一個內(nèi)存單元,存放兩位16進制數(shù)的數(shù)據(jù),也就是一個字節(jié),也就是說內(nèi)存單元存儲數(shù)據(jù)的最小單位是字節(jié)。
小端對齊:低地址放低位,高地址放高位。
指針變量p++表示向后移動一個類型長度的內(nèi)存,*p++表示先取值后移動。
在C語言中,數(shù)組名是一個常量(地址),值是不可以改變的。如array++這樣是不可以的。允許通過運算賦值給變量,如指針變量p=array+1表示指針p指向了數(shù)組的第二個元素。?
指針p[i]這樣是允許的,等價于array[i]。
指針數(shù)組
如char *s[10];表示數(shù)組里面的元素是指針。所以sizeof(s)=40;
數(shù)組指針
如 char (*s)[10];表示指向數(shù)組的指針,同時也意味著*s充當數(shù)組名。
二級指針(指向指針的指針)
在程序我們用到的指針對多是三級指針。
指針變量作為函數(shù)的參數(shù)
可以利用指針指向?qū)崊⒆兞康刂返奶攸c,改變實參變量的值。
一維數(shù)組作為函數(shù)的參數(shù)
當數(shù)組作為函數(shù)的參數(shù)時,C語言將數(shù)組名解釋為指針,所以sizeof(數(shù)組名)就會等于4個字節(jié)。當數(shù)組名作為函數(shù)參數(shù)傳遞給被調(diào)用函數(shù)時,被調(diào)用函數(shù)是不知道數(shù)組有多少元素。
相當于傳遞是一個地址,那么就可以通過地址來修改實參的值。
二維數(shù)組與指針
array表示二維數(shù)組名,那么*array就表示二維數(shù)組的首地址,這與一維數(shù)組有本質(zhì)的區(qū)別。
array表示二維數(shù)組名,那么array+1表示的是第一行、第零列的元素。那么array[0]+1表示第零行、第一列的元素。可以這么理解:二維數(shù)組是由多行的一位數(shù)組組成,那么它的組成單位就是一維數(shù)組,所以以二維數(shù)組名為代表的地址,長度就是一個一維數(shù)組,移動也只能以一維數(shù)組為單位地移動。那么一維數(shù)組是由元素組成,以一維數(shù)組名為代表的地址,長度就是一個元素大小,移動也只能移動以一個元素為單位地移動。
假如有一個二維數(shù)組array[3][4],那么我們用指針*p=array[3][4],*(p+1)只能一個個的遍歷。我們要想一行一行的遍歷,可以定義一個數(shù)組指針(*p)[4],(數(shù)組指針的定義:指向數(shù)組的指針)這樣就可以表示數(shù)組類型的指針,以4個元素為一個長度單位,*p可以表示數(shù)組名,同時也代表該地址的首地址。那么要想利用這樣的數(shù)組指針遍歷二維數(shù)組,就可以這樣寫*(*(p+i)+j),+i是代表向后移動一個行,+j是代表向后移動一個元素,也就是等價于array[i][j]。
二維數(shù)組可以看成一維數(shù)組的集合,所以可以定義一個數(shù)組指針表示指向數(shù)組的指針。

常量指針
const char *p;//定義一個指向常量的指針,通過指向常量的指針,可以限制指針修改一個變量的值。常量指針是值不能改變
指針*p可以分為兩部分看,第一部分:p表示指針變量,存放的是地址。第二部分*p表示的變量存放地址的值。
指針常量
char *const p;//定義一個指針是常量,一旦初始化,就不能再指向別的地址,這個就是常量的意義所在。
指針常量也稱常指針。指針常量是地址不能改變。
const 關(guān)鍵字保護數(shù)組內(nèi)容
如果將一個數(shù)組作為函數(shù)的形參傳遞,那么數(shù)組內(nèi)容可以在被調(diào)用函數(shù)內(nèi)部修改,有時候不希望這樣的事情發(fā)生,所以要對形參采用const參數(shù)。
如:func(const int array[])
指針作為函數(shù)的返回值
如:char *func()
指向函數(shù)的指針
指針可以指向變量、數(shù)組、也可以指向函數(shù)。
一個函數(shù)在編譯的時候會分配一個入口地址,這個入口地址就是函數(shù)的指針,函數(shù)名稱就代表函數(shù)的入口地址。
指向函數(shù)的指針的定義:void(*p)(int );表示定義了一個指向了一個有一個int類型的參數(shù),返回值是void類型的函數(shù)的指針。
指向函數(shù)的指針賦值:p=func3;表示讓p指向func3函數(shù)的入口地址,可以通過該指針來調(diào)用這個函數(shù)。
函數(shù)指針可以作為另外一個函數(shù)的參數(shù)
函數(shù)指針也就是指向函數(shù)的指針。
函數(shù)指針可以作為另外一個函數(shù)的參數(shù)來調(diào)用所指的函數(shù)。該過程稱為回調(diào)函數(shù),這是C語言特別高級的應用。
單線程:程序只能順序執(zhí)行。
多線程:程序并發(fā)執(zhí)行。

字符串指針
char *p="hello world";含義是指針p指向了字符串常量,常量區(qū)的內(nèi)容是不能被修改的。如果要改變常量的值就是非法操作,程序就會報錯。常量只讀。
漢字的ASCII值是負數(shù)。
指針數(shù)組作為main函數(shù)的形參
如:int main(int argc, char *argv[]):第一個參數(shù)就是告訴程序,第二個參數(shù)有多少個元素。
指針數(shù)組表示數(shù)組元素是指針的數(shù)組。char *argv[]相當于char **argv,那么char **argv表示指向char指針的指針。