程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> c語言中雙維數組與指針的那點事兒

c語言中雙維數組與指針的那點事兒

編輯:關於C語言

說起c語言的指針,估計對c語言只是一知半解的同志們可能都會很頭疼,尤其它跟數組又無恥的聯系到一起的時候,就更加淫蕩了!!!

怎麼說呢,就是有一點規定:(或准則)

       數組名可以看成是指向數組頭元素的指針,對,只是能看成。但,數組名,不是指針(不能相互賦值)。不過,可以當指針用。但是,指針不可以當數組名用。

在c語言的始祖書籍《K&R》中,有這麼一段聲明:只有在作為函數形參的時候

                                                                 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("%p\n",color);

 printf("%p\n",*color+1);  

printf("%p\n",*color+2);

 printf("%s\n",*color);

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

 printf("%c\n",color[0][0]);

 printf("%c\n",*(*color+1));

 printf("%c\n",(*color)[2]);

 printf("%c\n",*color[2]);

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

 printf("%c\n",*(*(color+1)+4));

 printf("%d\n",&(*(color+1))[4]);

 printf("%c\n",**color);

 printf("數組的數組\n");  printf("%s\n",*color);

 printf("%c\n",**(colors+1));

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

 printf("%c\n",colors[0][0]);

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

 printf("%c\n",*str);

 printf("%c\n",*str+2);

 printf("%c\n",*(str+1));

 printf("%s,%d\n",colors[0],sizeof(colors[0]));  

return 0;

}

逐個分析:

color是指向第一個數組的頭一個元素的指針,也是數組名,第一個數組實際是color[3][5].

那麼 *color   就是red 了,color指向red,加個*號,表示解引用,打印真實對象值;

         color[0]  很明顯,就是第一個元素,也是red;

        color[0][0]  第一個元素red的第一個元素 ,即r;

        **color  與上一個等價,*color是"red",而字符串又是char的數組,所以,就相當於*color又是char[]數組的指針了,再加一個*,解引用,就成r了;

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

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

因為  *color就是"red"嘛,*color就相當於char[]的數組名了呗,那麼(*color)[1],也就表示該char[]數組的第二個字母了,即e;

注意,我說的char[]數組就是char[]={'r','e','d','\0'},通篇公用哈~

再來區別一下:

          (*color)[1]   輸出e,即red裡面的e

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

因為  *color  整體代表一個數組名

        但由於這種表達式是從右向左結合的,所以如果沒有(),則首先會生成color[1],即字符串"green",而字符串"green"也可以看成是char[]數組,所以color[1],這時候還有一個角色就是char[]={'g','r','e','e','n','\0'}的數組名了,所以,再加個*,自然輸出的就是g了。

     同理:

             (*(color+1))[4]

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

再看看colors數組,它的聲明中沒有出現*號,那麼它該怎麼與*聯系呢?當然,只有一條:數組名可以看成是指向數組第一個元素的指針。

比如:  colors[0]

           *colors  等價,colors可以看成是指向"red"的指針,加*號解引用。

比如:  colors[1][0] 

           **(colors+1) 等價,其中,*(colors+1)是"green"  ,再加*號,表示"green"的第一個元素,即g。

程序運行的截圖:

歡迎討論~~

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved