說起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。
程序運行的截圖:
歡迎討論~~