常見的一級指針參數(shù)
先來看一個最常用函數(shù)模型,函數(shù)func()參數(shù)為一個uint8_t 的指針類型,那這個函數(shù)有什么作用?
uint8_t data1[3];
void func(uint8_t *p)
{
p[0]=0x01;
p[2]=0x02;
}
void main()
{
uint8_t *p1=data1;
func(data1);
}
- 在main函數(shù)中先定義了一個指針p1,然后把p1指向了一個數(shù)組data1。
- 把p1作為參數(shù)傳遞進函數(shù)func()
- 結(jié)果也很容易猜到,就是data1中的值在func運行時被改變了,分別等于0x01,0x02
那我們就不難理解,指針作為參數(shù)傳遞進去,而函數(shù)內(nèi)部就可以修改這個指針所指向的數(shù)據(jù)。如下圖所示:
而這個就是一級指針,簡單的可以看函數(shù)定義的參數(shù)帶一個 “*” 號就是一級指針。p1就是一個一級指針傳遞進去,而傳遞進去以后就可以修改這個一級指針所指向的地址的數(shù)據(jù),也就是data1。
假如我想修改p1所指向的地址,該怎么辦?
如下如所示,現(xiàn)在我想讓p1不再指向data1,而是指向data2
這個很明顯用上面的一級指針作為參數(shù)已經(jīng)實現(xiàn)不了,它只能修改p1所指向的地址的數(shù)據(jù),而現(xiàn)在是要修改p1本身讓他指向data2。有的小伙伴可能已經(jīng)能猜到,p1指向data1我們可以修改data1,那再用一個指針指向p1不就是可以修改p1了。
那這里我們就可以定義一個指針的指針pp1,讓他指向p1,這樣把pp1傳入到函數(shù)中,函數(shù)內(nèi)部就可以修改p1的值了。
代碼如下:
uint8_t data1[3];
uint8_t data2[3];
void func2(uint8_t **pp)
{
*p=data2;
}
void main()
{
uint8_t *p1=data1;
uint8_t *pp1=&p1;
func(pp1);
}
89101112
這里傳入的pp1就是一個二級指針,而func2的參數(shù)也是帶兩個星號。
那二級指針也就不難理解了,他可以修改指向的指針,也就是修改pp1指向的指針p1的值,讓p1可以指向另外一塊內(nèi)存。
那實際上一般在使用的時候可能大部分都會省略掉這個pp1而使用更簡便的寫法:
void main()
{
uint8_t *p1=data1;
func(&p1);
}
-
參數(shù)
+關(guān)注
關(guān)注
11文章
1829瀏覽量
32195 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4327瀏覽量
62573 -
指針
+關(guān)注
關(guān)注
1文章
480瀏覽量
70551 -
main
+關(guān)注
關(guān)注
0文章
38瀏覽量
6158
發(fā)布評論請先 登錄
相關(guān)推薦
評論