情境:
用argv接收命令行参数,由函数targv的三级指针接收并处理参数
指针作形参:
当把一个数组定义为函数的参数时,既可以把它定义为数组,也可以定义为指针。但不管定义成什么,在函数内部都只能当成指针。
C专家编程中文版徐波译P208P209
code:
#include <stdio.h>
int targv (int *argc, char ***argv); /* 定义成指针 */
int main (int argc, char **argv){ /* 主函数中应该不算形参*/
targv (&argc, &argv);
printf ("\n%s\n",argv[0]); /*可以用[] 访问 */
printf ("\n%c\n",argv[1][1]);
return 0;
}
int targv (int *argc, char ***argv){
/* 在函数内部只能当指针来使用,不能当数组使用,即使实参是数组*/
printf ("*argc:%d\n",*argc);
printf ("argv0:%s,argv1:%s, argv2:%s\n", *(*argv), *(*argv+1), *(*argv+2));
printf ("&argv:%.5x,argv:%.5x, *argv:%.5x, *argv+0:%.5x, *argv+1:%.5x,\
*argv+2:%.5x, **argv:%.5x\n",\
&argv, argv, *argv,*argv+0, *argv+1, *argv+2, **argv);
printf ("*(*argv+0):%.5x,*(*argv+1):%.5x, *(*argv+2):%.5x\n", *(*argv+0), \
*(*argv+1),*(*argv+2));
printf ("*(*argv+0)+0:%s,*(*argv+0)+1:%s, *(*argv+0)+2:%s\n", *(*argv+0)+0, \
*(*argv+0)+1,*(*argv+0)+2);
printf ("*(*(*argv+0)): %c, *(*(*argv+1)): %c ,*(*(*argv+2)): %c \n", *(*(*argv+0)),\
*(*(*argv+1)), *(*(*argv+2)));
printf ("*(*argv+1)+0:%s,*(*argv+1)+1:%s, *(*argv+1)+2:%s\n", *(*argv+1)+0, \
*(*argv+1)+1,*(*argv+1)+2);
printf ("*(*argv+2)+0:%s,*(*argv+2)+1:%s\n", *(*argv+2)+0, *(*argv+2)+1);
return 0;
}
results:
[pc2@localhost testc]$ ./targv -nnnnn44444
*argc:3
argv0:./targv,argv1:-nnnnn, argv2:44444
&argv:bf95d9e4, argv:bf95da04,*argv:bf95daa4, *argv+0:bf95daa4, *argv+1:bf95daa8,*argv+2:bf95daac, **argv:bf95f47d
*(*argv+0):bf95f47d,*(*argv+1):bf95f485, *(*argv+2):bf95f48c
*(*argv+0)+0:./targv,*(*argv+0)+1:/targv, *(*argv+0)+2:targv
*(*(*argv+0)): . , *(*(*argv+1)): -,*(*(*argv+2)): 4
*(*argv+1)+0:-nnnnn,*(*argv+1)+1:nnnnn, *(*argv+1)+2:nnnn
*(*argv+2)+0:44444, *(*argv+2)+1:4444
./targv
n
----------------------
指针结构:
[pc2@localhost testc]$ ./targv -nnnnn44444
*argc:3
argv0:./targv,argv1:-nnnnn, argv2:44444
&argv:bf95d9e4, argv:bf95da04,*argv:bf95daa4, *argv+0:bf95daa4, *argv+1:bf95daa8,*argv+2:bf95daac, **argv:bf95f47d
*(*argv+0):bf95f47d,*(*argv+1):bf95f485, *(*argv+2):bf95f48c
*(*argv+0)+0:./targv,*(*argv+0)+1:/targv, *(*argv+0)+2:targv
*(*(*argv+0)):. ,*(*(*argv+1)): - ,*(*(*argv+2)):4
均是指针的方式访问,不能用取下标操作符[]
*(*argv+1)+0:-nnnnn,*(*argv+1)+1:nnnnn, *(*argv+1)+2:nnnn
*(*argv+2)+0:44444, *(*argv+2)+1:4444
./targv在主函数中可以用[ ]
n
----------------------
bf95d9e4&argv
[bf95da04]---->| bf95da04*argv
| [bf95daa4]---->| bf95daa4*argv+0
| [bf95f47d]---------->| bf95f47d*(*argv+0)
| | ([.][/][t][a][r][g][v][\0])
| bf95daa8*argv+1
| [bf95f485]---------->| bf95f485*(*argv+1)
| | ([-][n][n][n][n][n][\0])
| bf95daac*argv+2
| [bf95f48c]---------->| bf95f48c*(*argv+2)
| | ([4][4][4][4][4][\0])
----------------------
bf95f47d*(*argv+0)
|bf95f47d*(*argv+0)+0 *(*(*argv+0)+0) [.]
|bf95f47e*(*argv+0)+1 *(*(*argv+0)+1) [/]
|bf95f47f*(*argv+0)+2 *(*(*argv+0)+2) [t]
|bf95f480*(*argv+0)+3 *(*(*argv+0)+3) [a]
|bf95f481*(*argv+0)+4 *(*(*argv+0)+4) [r]
|bf95f482*(*argv+0)+5 *(*(*argv+0)+5) [g]
|bf95f483*(*argv+0)+6 *(*(*argv+0)+6) [v]
|bf95f484*(*argv+0)+7 *(*(*argv+0)+7) [\0]
bf95f485*(*argv+1)
|bf95f485*(*argv+1)+0 *(*(*argv+1)+0) [-]
|bf95f486*(*argv+1)+1 *(*(*argv+1)+1) [n]
|bf95f487*(*argv+1)+2 *(*(*argv+1)+2) [n]
|bf95f488*(*argv+1)+3 *(*(*argv+1)+3) [n]
|bf95f489*(*argv+1)+4 *(*(*argv+1)+4) [n]
|bf95f48a*(*argv+1)+5 *(*(*argv+1)+5) [n]
|bf95f48b*(*argv+1)+6 *(*(*argv+1)+6) [\0]
bf95f48c*(*argv+2)
|bf95f48c*(*argv+2)+0 *(*(*argv+2)+0) [4]
|bf95f48d*(*argv+2)+1 *(*(*argv+2)+1) [4]
|bf95f48e*(*argv+2)+2 *(*(*argv+2)+2) [4]
|bf95f48f*(*argv+2)+3 *(*(*argv+2)+3) [4]
|bf95f490*(*argv+2)+4 *(*(*argv+2)+4) [4]
|bf95f491*(*argv+2)+5 *(*(*argv+2)+5) [\0]