欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
C語(yǔ)言中的多級指針

前言

C語(yǔ)言中指針,可以算是最靈活,最強大的地方,同時(shí)也是最艱深的地方。用不好的話(huà),什么段錯誤,內存違例等以前沒(méi)見(jiàn)過(guò)的東西都會(huì )跳出來(lái)。最近看《UNIX系統編程》,感覺(jué)能把C語(yǔ)言用到這個(gè)水平,才能算是登堂入室。

一般來(lái)說(shuō),我們會(huì )把指針跟數組聯(lián)系起來(lái)理解,比如*p就是一個(gè)一維數組,**p是兩維數組等,而一般而言,見(jiàn)到兩維的指針也算是難得了,更高維的只怕看一會(huì )就會(huì )暈掉。《UNIX系統編程》中有個(gè)關(guān)于參數列表的例子,感覺(jué)對指針運用的已經(jīng)到出神入化的境地,所以貼出來(lái)大家參考一下。

 

指向指針的指針

在C語(yǔ)言的入口main函數中,有一個(gè)**argv參數,指明命令行參數,一般寫(xiě)法是這樣:

C代碼
  1. int main(int argc, char **argv){  
  2.     /* 
  3.      * code here. 
  4.      */  
  5. }  

 

這個(gè)**argv,是一個(gè)指向指針的指針,用來(lái)將命令行參數保存下來(lái),比如,輸入一條命令:

prog -c -v 200

 **argv中的內容即為 prog, -c, -v, 200. 因為prog, -c等的長(cháng)度不等,就需要一個(gè)指針來(lái)引用他們,而prog后邊接幾個(gè)參數也是不定的,所以有需要有一個(gè)指針來(lái)引用,所以就是這里的二維指針了。畫(huà)一個(gè)table可能看起來(lái)比較清晰一些:

 

 

prog
-c
-v
200

 

再考慮這樣一種情況,shell程序,對于你會(huì )輸多少行命令也是不知道的,那它就需要再多一個(gè)指針來(lái)引用你會(huì )有多少個(gè)命令輸入。這就是我們今天要看的(***ptr)了。

 

指向"指針的指針"的指針

書(shū)中的例子是這樣,先看下函數的原型: 

C代碼
  1. int makeargv(const char *s, const char *delimiters, char ***argvp);  

 

函數接受三個(gè)參數,第一個(gè)是要分析的串,第二個(gè)是界定符序列,第三個(gè)是生成的"指針的指針"(即二維數組)的指針。實(shí)現比較簡(jiǎn)單,主要是看其中關(guān)于指針的用法:

C代碼
  1. /* 
  2.  * author : juntao.qiu 
  3.  */  
  4. int makeargv(const char *s, const char *delimiters, char ***argvp){  
  5.     int error;  
  6.     int i;  
  7.     int numtokens;  
  8.     const char *snew;  
  9.     char *t;  
  10.   
  11.     if((s == NULL) || (delimiters == NULL) || (argvp == NULL)){  
  12.         error = EINVAL;  
  13.         return -1;  
  14.     }  
  15.   
  16.     *argvp = NULL;  
  17.     snew = s + strspn(s, delimiters);  
  18.     if((t = malloc(strlen(snew)+1)) == NULL)  
  19.         return -1;  
  20.   
  21.     strcpy(t, snew);  
  22.     numtokens = 0;  
  23.   
  24.     if(strtok(t, delimiters) != NULL)  
  25.         for(numtokens = 1; strtok(NULL, delimiters)!= NULL; numtokens++);  
  26.   
  27.     if((*argvp = malloc((numtokens+1)*sizeof(char *))) == NULL){  
  28.         error = errno;  
  29.         free(t);  
  30.         errno = error;  
  31.         return -1;  
  32.     }  
  33.   
  34.     if(numtokens == 0){  
  35.         free(t);  
  36.     }else{  
  37.         strcpy(t, snew);  
  38.         **argvp = strtok(t, delimiters);//注意此處的指針操作  
  39.         for(i = 1;i < numtokens;i++)  
  40.             *((*argvp)+i) = strtok(NULL, delimiters);//注意此處的指針操作  
  41.     }  
  42.           
  43.     *((*argvp)+numtokens) = NULL;  
  44.   
  45.     return numtokens;  
  46. }  

 

 程序的主體比較簡(jiǎn)單,就是按照傳入的s,按照界定符delimiters對其進(jìn)行分割,分割完成后將其放在一個(gè)二維數組中,第一維表示最后數組,第二維表示第一個(gè)數組中每一個(gè)元素的值。

測試

好了,我們測試一下其運行情況:

 

C代碼
  1. int main(int argc, char **argv){  
  2.     char delim[] = " \t";  
  3.     int i;  
  4.     char **argvp;  
  5.     int numtokens;  
  6.     char *test = "mine -c 10 2.0";  
  7.   
  8.     if((numtokens = makeargv(test, delim, &argvp)) == -1){  
  9.         fprintf(stderr, "failed to parse the string you given:%s\n", test);  
  10.         return 1;  
  11.     }  
  12.     printf("argument contains :\n");  
  13.     for(i = 0;i < numtokens;i++)  
  14.         printf("%d:%s\n", i, argvp[i]);  
  15.     return 0;  
  16. }  

  

運行結果如下:

C:\development\cpl\usp>ls
Makefile a.exe makeargv.c nbproject

C:\development\cpl\usp>a
argument contains :
0:mine
1:-c
2:10
3:2.0

個(gè)人感覺(jué),能把指針用到這種熟練程度,才算是對C掌握了?!禪NIX系統編程》中的代碼非常優(yōu)雅,從大二一直讀到畢業(yè),畢業(yè)后得空還在讀。我會(huì )盡量陸續把體會(huì )貼出來(lái),以供參考。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
【轉】C/C++中的Split函數(字符串自動(dòng)分割)
strtok函數實(shí)現與應用
C語(yǔ)言面試題
高質(zhì)量C/C++編程(片段)
C和指針之字符串之實(shí)現strcpy函數
C/C++——strcpy函數的幾種實(shí)現和詳細解析
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久