日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深入理解C语言中两级指针(char **pptr)的参数的用法

發布時間:2023/12/8 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入理解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)的参数的用法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。