字串指標的運用及思考

2021-05-25 22:38:49 字數 976 閱讀 9841

"abc"是常量嗎?

答案是有時是、有時不是。

不是常量的情況:"abc"作為字元陣列初始值的時候就不是,如:

char str = "abc";

因為定義的是乙個字元陣列,所以就相當於定義了一些空間來存放"abc",又因為字元陣列就是把字元乙個乙個地存放的,所以編譯器把這個語句解析為

char str[3] = ;

又根據上面的總結1,所以char str = "abc";的最終結果是:

char str[4] = ;

做一下擴充套件,如果char str = "abc";是在函式內部寫的話,那麼這裡的"abc/0"因為不是常量,所以應該被放在棧上。

是常量的情況: 把"abc"賦給乙個字元指標變數時,如:

char* ptr = "abc";

因為定義的是乙個普通指標,並沒有定義空間來存放"abc",所以編譯器得幫我們找地方來放"abc",顯然,把這裡的"abc"當成常量並把它放到程式的常量區是編譯器最合適的選擇。所以儘管ptr的型別不是const char*,並且ptr[0] = 'x';也能編譯通過,但是執行ptr[0] = 'x';就會發生執行時異常,因為這個語句試圖去修改程式常量區中的東西。

記得哪本書中曾經說過char* ptr = "abc";這種寫法原來在c++標準中是不允許的,但是因為這種寫法在c中實在是太多了,為了相容c,不允許也得允許。雖然允許,但是建議的寫法應該是const char* ptr = "abc";這樣如果後面寫ptr[0] = 'x'的話編譯器就不會讓它編譯通過,也就避免了上面說的執行時異常。又擴充套件一下,如果char* ptr = "abc";寫在函式體內,那麼雖然這裡的"abc/0"被放在常量區中,但是ptr本身只是乙個普通的指標變數,所以ptr是被放在棧上的,只不過是它所指向的東西被放在常量區罷了。

對 與 char *ptr="abc"; 的運用我有時挺迷惑的。

書上說:ptr是字串常量不能對其進行賦值

字串及字元指標

近來在學習字串的一些操作,對字串有些認識 1 字串在使用時才動態分配的。2 程式在宣告字串變數時,實際分配的是32位的記憶體空間的乙個指標。該指標指向儲存實際字串的記憶體位址。當字串為空時,其指標值為nil。所以 str borland delphi sizeof str 返回的結果將是4,而不是字...

字串的運用

目錄name nick print name name nick print name gender male poem 鋤禾日當午,汗滴禾下土 誰知盤中餐,粒粒皆辛苦 print poem poem 鋤禾日當午,汗滴禾下土 誰知盤中餐,粒粒皆辛苦 print poem print nick s n...

字串函式運用

include include includeint main char c2 50 char c3 50 char c4 50 strcpy c2,c1 把c1 複製給 c2 puts c2 strcat c3,c1 連線c3 c1 c3 在前 puts c3 printf d n strcmp ...