1、前言
1)指標變數如同int變數一樣,在函式中,儲存在棧區,此時為區域性變數。其標誌是 *,可以理解為其型別是個*;
2)不論指標變數指向的是何種變數,對於指標變數來說所佔位元組都是一樣的,
例如:int *p 和double *q, p和q都是佔4個位元組,
不同的是,p++ 和q++,前者挪動了4個位元組,後者挪動了8個位元組
3)指標變數存的是個位址,即儲存是個整型值。
int a =1;
int *p = &a;
printf("%d\n",(int)p);//列印出p是十六位進製數
2、一重指標的理解
int a =2;
int *p = &a;
p前面有個*,表明變數p是個指標,指向的是*前面的資料型別int;
函式中,形參傳遞指標,可以改變實參解引用 的值大小
void func(int *para)
int aa = 1;
func(&aa);
printf("%d",aa);//aa的值變為2
3、二重指標的理解
int a =2;
int *p = &a;
int **q = &p;
同一重指標p一樣分析,q前面有個*,說明q是個*型變數,即是指標,指向的資料型別是個 int*,即指向指標的指標,為二重指標。
同一重指標一樣,函式中形參是二重指標(也是個指標),可以改變實參解引用 的值,實參解引用是一重指標,改變了一重指標的值,就是改變了一重指標指向的記憶體單元。
void func(int **para)
int aa = 1;
int *p = &aa;
func(&p);
printf("%d",(int)p);//p的值發生改變,指向了新的記憶體
函式形參為二重指標時,會先定義乙個一重指標變數a--->取位址變為實參b代入。
原因是想要進行指標傳遞,改變a的值,倘若直接定義實參b的,相當於是值傳遞,不會改變原值了。
函式引數為指標傳遞的形式,相當於給變數a加了一層保護,實參b的傳遞,是值傳遞(也就是複製),可以有多個,但是a只有乙個,而且自始至終都是這乙個。
我們以以下例子來分析二重指標的傳遞:
phtread_exit(void *ptr);
phtread_join(pthread_t thread,void** retval);
我們知道ptr的值返回給retval的。
我們分析一下,為什麼ptr是一重指標的時候,retval是二重指標?
由以下例子可以看出,我們在main函式中通過pthread_join 獲得ptr的值。void*ptr 是一重指標,我們要將其賦值給同樣的一重指標char* thread_res(未初始化);
我們知道要對乙個未初始化的變數代入函式中進行初始化的方式有兩種:一種是指標,一種是引用,很明顯函式採用了指標的方式來傳遞,char* thread_res是一重指標,形參retval是* 的話,只是值傳遞(對於未初始化的變數來說,不允許),所以,此處是**,即二重指標傳遞。
void *func(void *arg)
int main()
個人理解,thread_res = null;//此處只能將thread_res置空,而無法將func中s置空,因為phread_exit(void *ptr);
倘若phread_exit(void *ptr)是通過** 二重指標傳遞到pthread_join的話,就可以將s置空。
C語言之函式指標和二重函式指標
在分析uboot程式時發現乙個函式指標的用法,花了點時間研究一下。做個記錄。先說一下函式指標的基本用法。如下 int init01 void typedef int init func1 void 宣告一種函式型別 typedef int init func2 void 宣告一種函式指標型別 int...
C語言指標用法詳解 (三) 二重指標
二重指標 int ptr1 null cout 1 三省指標 指標 ptr1 的型別是 int 指向的型別 int 指定為空 2 ptr1 是 ptr 指向的指向 即空的指向,非法 3 ptr1 是 ptr 指向的指向的指向 即空的指向的指向,非法 1 三省指標 指標 p 的型別是 int 指向的型...
C基礎 二重指標和陣列指標
include int main1 void void fun char arr,int n void fun char arr,int n 二重指標傳參時等價於指標陣列 int main void fun s,3 return0 include int main1 void int p int p...