以前學C++的時候,對字符串和指針學的很模糊,現在有時間重新看C,開始還是很模糊,慢慢研究,漸漸有了頭緒,決定寫下來加深自己的印象。
首先,讓我們來看 char shuzu[7];聲明的字符串,直接上代碼
#include<stdio.h>
int main()
{
char shuzu[7]="123456";
printf("%x\n",&shuzu);
printf("%x\n",shuzu);
printf("%x\n",&shuzu[0]);
return 0;
}
輸出如圖:

可以看到,輸出的三個地址都相同。char shuzu[7]="123456"語句執行的時候,系統就分配了一段長7字節的連續內存,並把這段內存起名為shuzu,里面的值為"123456"
&shuzu,就是shuzu這個變量的內存地址,由於這段內存叫shuzu,所以shuzu的地址也就是這段內存的首地址,也就是'1'字符所在字節的地址;
shuzu,對於數組變量,可以使用變量名來索引變量中的內容,其實這里的shuzu可以理解成數組變量退化的指針,並且指向數組的開頭,既然把它理解成指針,那么它的值肯定是地址了,所以他的值和上面的一樣。(摘自互聯網)
&shuzu[0],比較容易理解,第一個字符串的地址,因此和上面兩個是一樣的。
下面再來看以方法char *shuzu="123456";聲明的字符串
#include<stdio.h>
int main()
{
char *shuzu="123456";
printf("%x\n",&shuzu);
printf("%x\n",shuzu);
printf("%x\n",&shuzu[0]);
return 0;
}
輸出如圖

可以看出 ,第一個和后兩個輸出有點區別,我們一個一個分析
首先,char *shuzu 是聲明一個char類型的指針變量,和數組名稱不同,它在內存中有自己的地址
&shuzu :就是取存儲指針變量的值,也就是shuzu這個變量在內存中存儲的地址
shuzu:存儲在指針變量中的值,指向"123456"這個數組的首地址("123456"返回值是一個char類型的指針)。
&shuzu[0]:數組中第一個字符的地址,和數組相同。
這里要弄清數組名稱和真正指針的區別。
最后來看最讓我頭疼的 指針數組
用該表達式聲明一個指針數組char *shuzu[]={"1","2"};
代碼如下
#include<stdio.h>
int main()
{
char *shuzu[]={"1","2"};
printf("%x\n",&shuzu);
printf("%x\n",shuzu);
printf("%x\n",&shuzu[0]);
return 0;
}
輸出如圖

其實也很好理解,我們把指針數組看成是普通的數組,數組名稱是shuzu,第一個值是shuzu[0],於是,這個數組和char shuzu[7]="123456"聲明的數組大概相似了。只是一個數組里存儲的char類型的指針,而另一個存儲的是char類型的值,這樣shuzu、&shuzu、和&shuzu[0]三個輸出相同,我們也就明白了。
另外,*shuzu 的值是第一個字符串的地址。和shuzu不同。。
