天天看點

C數組,指針

以前學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;

}

輸出如圖:

C數組,指針

可以看到,輸出的三個位址都相同。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;

}

輸出如圖

C數組,指針

可以看出 ,第一個和後兩個輸出有點差別,我們一個一個分析

首先,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;

}

輸出如圖

C數組,指針

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

另外,*shuzu 的值是第一個字元串的位址。和shuzu不同。。