以前學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不同。。