深入理解C语言中两级指针(char **pptr)的参数的用法
最近在看亞嵌的《Linux C編程一站式學(xué)習(xí)》,對其中的兩層指針的參數(shù)用法有些疑惑,下面和大家分享一下學(xué)習(xí)心得!
首先來看一段代碼:
/* main.c */ #include <stdio.h> #include <stdlib.h>static const char *msgg[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};void get_w_day(const char **pp) {pp[0] = msgg[2]; // *pp = msgg[0];pp[1] = msgg[3]; // *(pp+1) = msgg[1]; }int main(void) {char ptr[2] = {};const char *pptr = ptr; //這里初始化也可以為NULL,不會導(dǎo)致編譯出錯(cuò)和運(yùn)行時(shí)的段錯(cuò)誤,但在實(shí)際程序中最好詳細(xì)初始化const char **ppptr = &pptr; //在ppptr參數(shù)傳入get_w_day()函數(shù)之前,必須對其進(jìn)行初始化,否則會導(dǎo)致運(yùn)行時(shí)的段錯(cuò)誤//仔細(xì)想一下原因,如果ppptr是NULL,那么get_w_day()函數(shù)修改的*ppptr就會修改一個(gè)不確定的位置//進(jìn)一步從底層查找原因,如果ppptr是NULL,那么傳入get_w_day()時(shí)刻的實(shí)際值就是0x0,也就是我們要操作*((char*)0x00) = ??//這樣必然導(dǎo)致一個(gè)段錯(cuò)誤get_w_day(ppptr);char fuck = **ppptr + 1; //這里的fuck應(yīng)該等于幾? 答案是'U' ==> 'T'+1 char fuckk = *(*ppptr + 1); //如果是 fuck = *(*ppptr + 1) 呢? 答案是 'u' ==> 指向"Tuesday"頭指針加1char fuckkk = **(ppptr + 1); //如果是 **(ppptr + 1)呢?答案是'V'char fuckkkk = **((ppptr+1) + 1 //是'W' ==> 'V'+1char fuckkkkk = **((ppptr+2) + 1 //是一個(gè)不確定的值,有可能引起段錯(cuò)誤printf("%s\t%s\n", *ppptr, *(ppptr+1)); return 0; }
指針就是指向內(nèi)存地址的變量,二級指針也是指針,即指向指針的指針,同樣可以表示傳入?yún)?shù)、傳出參數(shù)或者Value-result參數(shù),只不過該參數(shù)所指的內(nèi)存空間應(yīng)該解釋成一個(gè)指針變量。
這里有一個(gè)法則,傳入一個(gè)N級的指針,就可以修改N-1級的指針,原因是C語言的參數(shù)傳遞是按值傳遞的,直接修改形參是無法改變實(shí)參的,但可以通過傳入的指針參數(shù)修改其指向的的內(nèi)容,N級指針指向的內(nèi)容就是一個(gè)N-1級的指針,邊界情況就是參數(shù)是一個(gè)非指針類型的變量,可以理解為0級指針,這樣就修改不了其內(nèi)容。
對于上述代碼,可以在gei_w_day()函數(shù)中,修改一級指針的內(nèi)容,即可以修改×ppptr的值,而*ppptr 對應(yīng) pptr,這里把他看成一個(gè)字符串?dāng)?shù)組名,從而可以理解為可以在gei_w_day()函數(shù)中改變字符串?dāng)?shù)組中的0項(xiàng)、1項(xiàng)...的值。
? ? ? ? 在來看看形參中const的作用,如下代碼所示,
char ** p1; // int元素不可修改 char * const * p2; // int *一級指針不可修改 char ** const p3; // int **二級指針不可修改
思考題: //思考題:如果將下述代碼做改動(dòng),那么 printf("%s\t%s\n", *ppptr, *(ppptr+2)); 能否打印出 void get_w_day(const char **pp) {pp[0] = msgg[2]; pp[1] = msgg[3];pp[2] = msgg[4]; //新增... }
總結(jié)
以上是生活随笔為你收集整理的深入理解C语言中两级指针(char **pptr)的参数的用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: S32K144(18)LPI2C
- 下一篇: cf1527 c Sequence P