浅谈C语言中的多级指针

  • 格式:doc
  • 大小:51.00 KB
  • 文档页数:5

浅谈C语言中的多级指针一般来说,我们会把指针跟数组联系起来理解,比如*p就是一个一维数组,**p是两维数组等,而一般而言,见到两维的指针也算是难得了,更高维的只怕看一会就会晕掉。

《UNIX系统编程》中有个关于参数列表的例子,感觉对指针运用的已经到出神入化的境地,所以贴出来大家参考一下。

指向指针的多级指针在C语言的入口main函数中,有一个**argv参数,指明命令行参数,一般写法是这样: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,是一个指向指针的指针,用来将命令行参数保存下来,比如,输入一条命令:prog -c -v 200**argv中的内容即为 prog, -c, -v, 200. 因为prog, -c等的长度不等,就需要一个指针来引用他们,而prog后边接几个参数也是不定的,所以有需要有一个指针来引用,所以就是这里的二维指针了。

画一个table可能看起来比较清晰一些:再考虑这样一种情况,shell程序,对于你会输多少行命令也是不知道的,那它就需要再多一个指针来引用你会有多少个命令输入。

这就是我们今天要看的(***ptr)了。

指向"指针的指针"的多级指针书中的例子是这样,先看下函数的原型:C代码12.int makeargv(const char *s, const char *delimiters, char ***argvp);13.int makeargv(const char *s, const char *delimiters, char ***argvp);函数接受三个参数,第一个是要分析的串,第二个是界定符序列,第三个是生成的"指针的指针"(即二维数组)的指针。

实现比较简单,主要是看其中关于指针的用法:C代码14./*15. * author : juntao.qiu16. */17.int makeargv(const char *s, const char *delimiters, char ***argvp){18. int error;19. int i;20. int numtokens;21. const char *snew;22. char *t;23.24. if((s == NULL) || (delimiters == NULL) || (argvp == NULL)){25.error = EINVAL;26. return -1;27. }28.29. *argvp = NULL;30.s snew = s + strspn(s, delimiters);31. if((t = malloc(strlen(snew)+1)) == NULL)32. return -1;33.34. strcpy(t, snew);35.numtokens = 0;36.37. if(strtok(t, delimiters) != NULL)38. for(numtokens = 1; strtok(NULL, delimiters)!= NULL; numtokens++);39.40. if((*argvp = malloc((numtokens+1)*sizeof(char *))) == NULL){41.error = errno;42. free(t);43.errno = error;44. return -1;45. }46.47. if(numtokens == 0){48. free(t);49. }else{50. strcpy(t, snew);51. **argvp = strtok(t, delimiters);//注意此处的指针操作52. for(i = 1;i <numtokens;i++)53. *((*argvp)+i) = strtok(NULL, delimiters);//注意此处的指针操作54. }55.56. *((*argvp)+numtokens) = NULL;57.58. return numtokens;60.61./*62. * author : juntao.qiu63. */64.int makeargv(const char *s, const char *delimiters, char ***argvp){65. int error;66. int i;67. int numtokens;68. const char *snew;69. char *t;70.71. if((s == NULL) || (delimiters == NULL) || (argvp == NULL)){72.error = EINVAL;73. return -1;74. }75.76. *argvp = NULL;77.s snew = s + strspn(s, delimiters);78. if((t = malloc(strlen(snew)+1)) == NULL)79. return -1;80.81. strcpy(t, snew);82.numtokens = 0;83.84. if(strtok(t, delimiters) != NULL)85. for(numtokens = 1; strtok(NULL, delimiters)!= NULL; numtokens++);86.87. if((*argvp = malloc((numtokens+1)*sizeof(char *))) == NULL){88.error = errno;89. free(t);90.errno = error;91. return -1;92. }93.94. if(numtokens == 0){95. free(t);96. }else{97. strcpy(t, snew);98. **argvp = strtok(t, delimiters);//注意此处的指针操作99. for(i = 1;i <numtokens;i++)100. *((*argvp)+i) = strtok(NULL, delimiters);//注意此处的指针操作101. }102.103. *((*argvp)+numtokens) = NULL;105. return numtokens;106.}程序的主体比较简单,就是按照传入的s,按照界定符delimiters对其进行分割,分割完成后将其放在一个二维数组中,第一维表示最后数组,第二维表示第一个数组中每一个元素的值。

测试好了,我们测试一下其运行情况:C代码107.int main(int argc, char **argv){108. char delim[] = " \t";109. int i;110. char **argvp;111. int numtokens;112. char *test = "mine -c 10 2.0";113.114. if((numtokens = makeargv(test, delim, &argvp)) == -1){115. fprintf(stderr, "failed to parse the string you given:%s\n", test);116. return 1;117. }118. printf("argument contains :\n");119. for(i = 0;i <numtokens;i++)120. printf("%d:%s\n", i, argvp[i]);121. return 0;122.}123.124.int main(int argc, char **argv){125. char delim[] = " \t";126. int i;127. char **argvp;128. int numtokens;129. char *test = "mine -c 10 2.0";130.131. if((numtokens = makeargv(test, delim, &argvp)) == -1){132. fprintf(stderr, "failed to parse the string you given:%s\n", test);133. return 1;134. }135. printf("argument contains :\n");136. for(i = 0;i <numtokens;i++)137. printf("%d:%s\n", i, argvp[i]);138. return 0;139.}运行结果如下:140.C:\development\cpl\usp>ls141.Makefile a.exe makeargv.c nbproject 142.143.C:\development\cpl\usp>a144.argument contains :145.0:mine146.1:-c147.2:10148.3:2.0。