深入理解C语言中两级指针(char **pptr)的参数的用法
生活随笔
收集整理的這篇文章主要介紹了
深入理解C语言中两级指针(char **pptr)的参数的用法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近在看亞嵌的《Linux C編程一站式學習》,對其中的兩層指針的參數用法有些疑惑,下面和大家分享一下學習心得!
首先來看一段代碼:
/* 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,不會導致編譯出錯和運行時的段錯誤,但在實際程序中最好詳細初始化const char **ppptr = &pptr; //在ppptr參數傳入get_w_day()函數之前,必須對其進行初始化,否則會導致運行時的段錯誤//仔細想一下原因,如果ppptr是NULL,那么get_w_day()函數修改的*ppptr就會修改一個不確定的位置//進一步從底層查找原因,如果ppptr是NULL,那么傳入get_w_day()時刻的實際值就是0x0,也就是我們要操作*((char*)0x00) = ??//這樣必然導致一個段錯誤get_w_day(ppptr);char fuck = **ppptr + 1; //這里的fuck應該等于幾? 答案是'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 //是一個不確定的值,有可能引起段錯誤printf("%s\t%s\n", *ppptr, *(ppptr+1)); return 0; }
指針就是指向內存地址的變量,二級指針也是指針,即指向指針的指針,同樣可以表示傳入參數、傳出參數或者Value-result參數,只不過該參數所指的內存空間應該解釋成一個指針變量。
這里有一個法則,傳入一個N級的指針,就可以修改N-1級的指針,原因是C語言的參數傳遞是按值傳遞的,直接修改形參是無法改變實參的,但可以通過傳入的指針參數修改其指向的的內容,N級指針指向的內容就是一個N-1級的指針,邊界情況就是參數是一個非指針類型的變量,可以理解為0級指針,這樣就修改不了其內容。
對于上述代碼,可以在gei_w_day()函數中,修改一級指針的內容,即可以修改×ppptr的值,而*ppptr 對應 pptr,這里把他看成一個字符串數組名,從而可以理解為可以在gei_w_day()函數中改變字符串數組中的0項、1項...的值。
? ? ? ? 在來看看形參中const的作用,如下代碼所示,
char ** p1; // int元素不可修改 char * const * p2; // int *一級指針不可修改 char ** const p3; // int **二級指針不可修改
思考題: //思考題:如果將下述代碼做改動,那么 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]; //新增... }
總結
以上是生活随笔為你收集整理的深入理解C语言中两级指针(char **pptr)的参数的用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: S32K144(18)LPI2C
- 下一篇: cf1527 c Sequence P