自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

淺談C語言中的多級指針

開發(fā) 后端
C語言中指針,可以算是最靈活,最強大的地方,同時也是最艱深的地方。用不好的話,什么段錯誤,內(nèi)存違例等以前沒見過的東西都會跳出來。本文將簡單談?wù)凜語言中的多級指針。

最近看《UNIX系統(tǒng)編程》,感覺能把C語言用到這個水平,才能算是登堂入室。

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

指向指針的多級指針

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

C代碼

  1. int main(int argc, char **argv){     
  2.     /*    
  3.      * code here.    
  4.      */    
  5. }    
  6.  
  7. int main(int argc, char **argv){  
  8.     /*  
  9.      * code here.  
  10.      */  
  11. }  

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

prog -c -v 200

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

prog
-c
-v
200

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

指向"指針的指針"的多級指針

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

C代碼

  1. int makeargv(const char *s, const char *delimiters, char ***argvp);    
  2. int makeargv(const char *s, const char *delimiters, char ***argvp);  

函數(shù)接受三個參數(shù),第一個是要分析的串,第二個是界定符序列,第三個是生成的"指針的指針"(即二維數(shù)組)的指針。實現(xià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.     ssnew = 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. }    
  47.  
  48. /*  
  49.  * author : juntao.qiu  
  50.  */  
  51. int makeargv(const char *s, const char *delimiters, char ***argvp){  
  52.     int error;  
  53.     int i;  
  54.     int numtokens;  
  55.     const char *snew;  
  56.     char *t;  
  57.  
  58.     if((s == NULL) || (delimiters == NULL) || (argvp == NULL)){  
  59.         error = EINVAL;  
  60.         return -1;  
  61.     }  
  62.  
  63.     *argvp = NULL;  
  64.     ssnew = s + strspn(s, delimiters);  
  65.     if((t = malloc(strlen(snew)+1)) == NULL)  
  66.         return -1;  
  67.  
  68.     strcpy(t, snew);  
  69.     numtokens = 0;  
  70.  
  71.     if(strtok(t, delimiters) != NULL)  
  72.         for(numtokens = 1; strtok(NULL, delimiters)!= NULL; numtokens++);  
  73.  
  74.     if((*argvp = malloc((numtokens+1)*sizeof(char *))) == NULL){  
  75.         error = errno;  
  76.         free(t);  
  77.         errno = error;  
  78.         return -1;  
  79.     }  
  80.  
  81.     if(numtokens == 0){  
  82.         free(t);  
  83.     }else{  
  84.         strcpy(t, snew);  
  85.         **argvp = strtok(t, delimiters);//注意此處的指針操作  
  86.         for(i = 1;i < numtokens;i++)  
  87.             *((*argvp)+i) = strtok(NULL, delimiters);//注意此處的指針操作  
  88.     }  
  89.           
  90.     *((*argvp)+numtokens) = NULL;  
  91.  
  92.     return numtokens;  
  93. }  

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

測試

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

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. }    
  17.  
  18. int main(int argc, char **argv){  
  19.     char delim[] = " \t";  
  20.     int i;  
  21.     char **argvp;  
  22.     int numtokens;  
  23.     char *test = "mine -c 10 2.0";  
  24.  
  25.     if((numtokens = makeargv(test, delim, &argvp)) == -1){  
  26.         fprintf(stderr, "failed to parse the string you given:%s\n", test);  
  27.         return 1;  
  28.     }  
  29.     printf("argument contains :\n");  
  30.     for(i = 0;i < numtokens;i++)  
  31.         printf("%d:%s\n", i, argvp[i]);  
  32.     return 0;  
  33. }   

運行結(jié)果如下:

  1. C:\development\cpl\usp>ls   
  2. Makefile a.exe makeargv.c nbproject   
  3.  
  4. C:\development\cpl\usp>a   
  5. argument contains :   
  6. 0:mine   
  7. 1:-c   
  8. 2:10   
  9. 3:2.0 

個人感覺,能把指多級指針用到這種熟練程度,才算是對C掌握了。《UNIX系統(tǒng)編程》中的代碼非常優(yōu)雅,從大二一直讀到畢業(yè),畢業(yè)后得空還在讀。我會盡量陸續(xù)把體會貼出來,以供參考。

【編輯推薦】

  1. C語言指針概念全面解析
  2. 講述C和指針的故事
  3. C++引用計數(shù)的智能指針的有效回收方法
  4. C++中數(shù)組和指針類型的關(guān)系
  5. 應(yīng)用C語言編輯畫圖程序
責(zé)任編輯:彭凡 來源: javaeye
相關(guān)推薦

2022-01-06 14:25:24

C語言指針內(nèi)存

2021-12-06 11:19:47

語言指針內(nèi)存

2023-10-27 11:21:20

C語言Multics語言

2011-07-14 10:23:33

C語言

2011-06-15 10:53:05

C語言

2010-07-13 15:34:09

Perl語言

2010-07-26 16:23:23

Perl語言

2022-03-29 08:30:47

指針數(shù)組C語言

2021-01-13 06:58:35

C語言函數(shù)指針

2010-01-15 19:17:48

C++語言

2011-05-13 17:25:34

C

2010-08-24 16:00:43

C語言

2022-07-27 16:40:25

C語言

2023-12-21 11:46:48

C語言柔性數(shù)組開發(fā)

2011-03-30 11:01:13

C語言隨機

2009-06-18 12:37:26

java編程語言

2010-01-18 13:54:28

函數(shù)

2011-08-29 09:19:25

c語言

2010-01-21 15:48:38

C++語言

2023-12-29 08:27:36

C語言靜態(tài)變量開發(fā)
點贊
收藏

51CTO技術(shù)棧公眾號