c语言中双维数组与指针的那点事儿

作者: 贝博体育app网络  发布:2019-11-15

提起c语言的指针,估计对c语言只是一叶障目的老同志们或者都会非常高烧,尤此外跟数组又可耻的关系到一只的时候,就进一层淫荡了!!!

怎么说呢,便是有一点点规定:(或轨道)

       数组名能够用作是指向数组头成分的指针,对,只是能当作。但,数组名,不是指针(无法相互赋值卡塔尔国。可是,能够当指针用。可是,指针不可以当数组名用。

在c语言的主公书籍《K&福特Explorer》中,有这般意气风发段申明:唯有在作为函数形参的时候

                                                                 int a[];

                                                                 int *a;   具备相近的意义。 那个必定要领会。   

例如: char str[]="abc";

          str[0]='d'; -----可写

        

          char *str="abc";

          str[0]='d';-----日常会报错

下一场,入眼驾驭下二维数组与指针的关系(注:未有二维数组这么个东西,标准叫法是数组的数组卡塔尔国

代码:

#include<stdio.h>

int main()

{

 char* color[]={   "red",   "green",   "blue"  };  

char colors[][6]={   "red",   "green",   "blue"  };

 printf("%pn",color);

 printf("%pn",*color+1);  

printf("%pn",*color+2);

 printf("%sn",*color);

 printf("%sn",color[0]);

 printf("%cn",color[0][0]);

 printf("%cn",*(*color+1));

 printf("%cn",(*color)[2]);

 printf("%cn",*color[2]);

 printf("%cn",*&(*(color+1))[4]);//jiu zhe me xiao zhang

 printf("%cn",*(*(color+1)+4));

 printf("%dn",&(*(color+1))[4]);

 printf("%cn",**color);

 printf("数组的数组n");  printf("%sn",*color);

 printf("%cn",**(colors+1));

 printf("%sn",color[0]);

 printf("%cn",colors[0][0]);

 printf("字符串n");  char* str="abc";

 printf("%cn",*str);

 printf("%cn",*str+2);

 printf("%cn",*(str+1));

 printf("%s,%dn",colors[0],sizeof(colors[0]));  

return 0;

}

逐个剖析:

color是指向第一个数组的头三个要素的指针,也是数组名,第二个数组实际是color[3][5].

那么 *color   就是red 了,color指向red,加个*号,表示解引用,打字与印刷真实对象值;

         color[0]  很分明,正是第七个成分,也是red;

        color[0][0]  第叁个成分red的第1个成分 ,即r;

        **color  与上叁个特别,*color是"red",而字符串又是char的数组,所以,就一定于*color又是char[]数组的指针了,再加一个*,解引用,就成r了;

                  char[]={'r','e','d',''}

同理   *(*color+1) ,就是第二个字母e了;

因为  *color就是"red"嘛,*color就一定于char[]的数组名了嘛,那么(*color)[1],也就意味着该char[]数组的第贰个假名了,即e;

注意,我说的char[]数组就是char[]={'r','e','d',''},通篇公用哈~

再来不相同一下:

          (*color)[1]   输出e,即red里面的e

          *color[1]     输出g,即green的g;

因为  *color  全部代表叁个数组名

        但由于这种表明式是从右向左结合的,所以要是未有(),则率先会生成color[1],即字符串"green",而字符串"green"也足以作为是char[]数组,所以color[1],这个时候还应该有二个剧中人物正是char[]={'g','r','e','e','n',''}的数组名了,所以,再加个*,自然输出的就是g了。

     同理:

             (*(color+1))[4]

              *(*(color+1)+4)等价。

再看看colors数组,它的扬言中未有现身*号,那么它该怎么与*关系呢?当然,独有一条:数组名可以作为是指向数组第叁个成分的指针。

比如:  colors[0]

           *colors  等价,colors可以用作是指向"red"的指针,加*号解引用。

比如:  colors[1][0] 

           **(colors+1) 等价,其中,*(colors+1)是"green"  ,再加*号,表示"green"的率先个要素,即g。

程序运转的截图:

图片 1

应接研究~~

怎...

本文由贝博体育app发布于贝博体育app网络,转载请注明出处:c语言中双维数组与指针的那点事儿

关键词: