C語言中字元陣列和字串指標分析

2021-06-18 13:47:32 字數 1821 閱讀 6559

這幾天搞unix上的c程式,裡面用到了很多字元陣列和字串指標,我記得在學完c語言後相當一段時間裡,對指標這個東西還是模模糊糊,後來工作也沒怎麼用到過c,雖然網上這類的文章也有很多,還是決定自己在這做個小總結,也算加深下自己的印象,寫了下面的測試程式:

01#include

02

03intmain(intargc,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的記憶體,並把這段記憶體起...