char*、char**和char***的使用

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;

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

  • 27
    点赞
  • 190
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值