char *argv[] 与 char **argv

#include<stdio.h>
#include<string.h>
int main(int argc,char *argv[])//同int main(int argc,char **argv)
{
  char *str_test = "hello wang";
  int i,j,len;
  for(i=0;i<argc;i++)
  {
    printf("argv%d is %s\n",i,argv[i]);
    len = strlen(argv[i]);
    printf("len = %d\n",len);
    for(j=0;j<len;j++)
    {
      printf("argv%d%d is %c\n",i,j,argv[i][j]);
    }
  }
  printf("str_test = %s\n",str_test);
  printf("str_test = %c\n",str_test[1]);
  return 0;
}

//argv:字符串数组,内容为指向字符串的指针(argv[0],argv[1],argv[2])

//argv[0],argv[1],argv[2]分别指向第1,2,3个字符串的指针
//argv[0][i],argv[1][i],argv[2][i]分别为第1,2,3个字符串中的第i个字符

//strlen():计算的是字符串实际个数(长度),不包括'\0',遇到第一个'\0'结束.如果你只定义没有给它赋初值,这个结果是不定的,它会从首地址一直找下去,直到遇到'\0'停止.
//sizeof():返回的是变量声明后所占的内存数(即变量类型的字节数),不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen()是函数

//不严格的来看:    *str = c[]

                            **str = *str[] = c[][]

/*wang@wang-X455LJ:~/program_test/c_program_test$ ./test wang cai
argv0 is ./test
len = 6
argv00 is .
argv01 is /
argv02 is t
argv03 is e
argv04 is s
argv05 is t
argv1 is wang
len = 4
argv10 is w
argv11 is a
argv12 is n
argv13 is g
argv2 is cai
len = 3
argv20 is c
argv21 is a
argv22 is i
str_test = hello wang
str_test = e*/

 

原文链接:https://blog.csdn.net/modi000/article/details/107154520

0、前言
指针可以指向一个变量,也可以指向一个同类型的数组。

指针总可以通过添加[]来进行解引用。

指针与数组是相通的。在分析变量数据类型的时候,可以通过相通性来理解:

char *str ------------> char ch[]; 指针可以去掉*,添加[];--->所以,指针可以赋值为数组名;

char ch[]------------> char *str ; 数组名去掉[],添加*;-------->所以,数组名是个地址。

1、char*的使用
//char*对应char变量的地址外,还 //一重指针对应的是一维数组

char str[] = "hello";

char* ch = str; //ch等同于str

printf(" %s",ch);

2、char**的使用
char**对应char* 变量的地址外,还//二重指针对应的是指针数组,而不是二维数组。

char *str[] = {"hello","world"};

char **ch = str ; //ch等同于str

printf("%s\n",ch[0]);

printf("%s\n",ch[1]);

 

小结:

char** ch ,通过添加一个[]解引用,去掉一个*,---------------->char *str[];--------->str[]显示为字符串

char *str[],通过添加一个[]解引用,去掉一个*,--------------->char st[][];--------->st[][] 显示为字符。

ps:通过这种方式可以查看变量的数据类型。

******************************************************************************

以上也可以写成:

char str[][6] ={"hello","world"};

方法一:使用数组指针指向二维数组:char (*ch)[6] = str; //数组指针对应的才是二维数组

方法二:使用指针数组分别指向二维数组中的各个一维数组:

char *ch[2];

ch[0] = str[0];

ch[1] = str[1];

3、char***的使用
总的思路:通过一步一步替换的方法,还原到最终的结果。

1)char*** 对应char**的地址; //char***对应二重指针的地址

char *str[] = {"hello","world"};
char **data = str; //data与str等同
char ***mm = &data; //mm[0]等同于data
printf("%s\n",mm[0][0]);
printf("%s\n",mm[0][1]);


分析:

char ***mm = &data; 所以mm[0]等同于data;

char **data = str; data等同于str;所以,str等同于mm[0]

char *str[] = {"hello","world"}; 所以,str[0]等同于 mm[0][0];str[1]等同于mm[0][1];

2)char*** 对应 char** ch[]; //char***对应二重指针数组

//因为char** 指向的是char* ch[];

char *str1[] = {"hello","world"};
char *str2[] = {"nihao","shijie"};
char **ch[]={str1,str2}; //str1等同于ch[0],str2等同于ch[1]
printf("%s\n",ch[0][0]);
printf("%s\n",ch[0][1]);
printf("%s\n",ch[1][0]);
printf("%s\n",ch[1][1]);

printf("**************************\n");
char ***str = ch; //str与ch等同
printf("%s\n",str[0][0]);
printf("%s\n",str[0][1]);
printf("%s\n",str[1][0]);
printf("%s\n",str[1][1]);


分析:

a) char **ch[]={str1,str2}; 所以,ch[0]等同于str1;ch[1]等同于str2;

char *str1[] = {"hello","world"}; 所以str1[0]等同于ch[0][0],str1[1]等同于ch[0][1]
char *str2[] = {"nihao","shijie"}; 所以str1[0]等同于ch[1][0],str1[1]等同于ch[1][1]

b)char ***str = ch; 所以,str等同于ch .str[0]等同于ch[0],等同于str1; str[1]等同于ch[1],等同于str2

str[0][0] 等同于ch[0][0],等同于str1[0];str[0][1] 等同于ch[0][1],等同于str1[1]

str[1][0] 等同于ch[1][0],等同于str2[1];str[1][1] 等同于ch[1][1],等同于str2[1]

小结:

char*** str 通过一个[]解引用,可以去掉一个* ------------------>char **ch[]--->ch[]为一个二重指针

char **ch[] 再通过一个[]解引用,又去掉一个* ------------------->char *c[][] ---->所以c[][]是字符串类型。

ps:通过这种方式可以查看变量的数据类型。

4、总结:
指针 数组 指针
char* str
char ch[]

str = ch;

char cc;

str = &cc

char **str
char *ch[]

str = ch;

char *cc;

str = &cc;

char ***str
char **ch[]

str = ch;

char **cc;

str = &cc;

多维指针与通过添加一个[]解引用的值相对应 多维指针与低维指针取地址相对应

posted on 2015-07-17 15:35  543680484  阅读(5397)  评论(2编辑  收藏  举报