這幾天搞unix上的c程式,裡面用到了很多字元陣列和字串指標,我記得在學完c語言後相當一段時間裡,對指標這個東西還是模模糊糊,後來工作也沒怎麼用到過c,雖然網上這類的文章也有很多,還是決定自己在這做個小總結,也算加深下自己的印象,寫了下面的測試程式:
01
#include
02
03
int
main(
int
argc,
char
*argv)
04
執行後螢幕上得到如下結果:
其實看到結果估計很多東西就好明白了,
先看看前三個輸出也就是關於變數day的,在 char day[15] = "abcdefghijklmn"; 這個語句執行的時候,系統就分配了一段長15的記憶體,並把這段記憶體起名為day,裡面的值為"abcdefghijklmn",如下圖所示:
再看程式,第乙個輸出,&day,&號是位址運算子,也就是day這個變數的記憶體位址,很明顯,在最前面,也就是a字元所在位元組的位址;
對於第二個輸出也就好理解了,&day[0],就是day陣列中第乙個變數(也就是a)的位址,因此他們兩個是一樣的;
第三個輸出是day,對於陣列變數,可以使用變數名來索引變數中的內容,其實這裡的day可以理解成陣列變數退化的指標,並且指向陣列的開頭,既然把它理解成指標,那麼它的值肯定是位址了,所以他的值和上面兩個也一樣。
再看看後面三個輸出,關於字串指標strtmp,在執行char* strtmp = "opqrstuvwxyz";後,記憶體的圖示如下:
如圖所示,記憶體分配了兩段記憶體,乙個名為strtmp,型別是乙個字元指標,另外一段是乙個字串常量,且strtmp裡面存放著字元常量的首位址,注意這裡無法通過strtmp修改這段字串,因為是常量;於是程式中的後面三個輸出就好理解了;
&strtmp:strtmp這個字元指標的位址
&strtmp[0]:strtmp所指字元常量第乙個字元的位址
strtmp:strtmp這個字元指標的值,即字元常量的首位址
因此,最後兩個的值是一樣的。
指標可以這樣理解,指標這種型別,和int,char,double等等是一樣的,只是它用來儲存位址值的,而int變數儲存整數,char變數儲存字元,僅此而已,就char型指標或者int指標,本質是一樣的,都是存放的位址,只不過那個位址所裡面的變數型別不同而已,還有一種void型指標,就是可以放任何型別變數的位址。
看了很有啟發,小小優化一下:
C語言中字元陣列和字串指標分析
寫下面的測試程式 include int main int argc,char argv 執行後螢幕上得到如下結果 其實看到結果估計很多東西就好明白了,先看看前三個輸出也就是關於變數day的,在 char day 15 abcdefghijklmn 這個語句執行的時候,系統就分配了一段長15的記憶體...
C語言中字元陣列和字串指標分析
這幾天搞unix上的c程式,裡面用到了很多字元陣列和字串指標,我記得在學完c語言後相當一段時間裡,對指標這個東西還是模模糊糊,後來工作也沒怎麼用到過c,雖然網上這類的文章也有很多,還是決定自己在這做個小總結,也算加深下自己的印象,寫了下面的測試程式 include int main int argc...
C語言中字元陣列和字串指標分析
include int main int argc,char argv 執行後螢幕上得到如下結果 其實看到結果估計很多東西就好明白了,先看看前三個輸出也就是關於變數day的,在 char day 15 abcdefghijklmn 這個語句執行的時候,系統就分配了一段長15的記憶體,並把這段記憶體起...