三级指针作形参(命令行参数处理)

情境:

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]


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值