字串指標和字元陣列

2021-06-04 23:05:48 字數 1497 閱讀 1948

很多剛從c 轉c++ 的人都不明白,在c 中這樣的**

char *pchar="hello!" ; // 定義字元指標pchar ,指向乙個字元陣列首

元素即h

*pchar='h'; // 問題所在行

到了c++ 中怎麼就不行了?你翻遍參考書,都會說,pchar 指向的是常量,

怎麼能允許改變呢?你又問了,怎麼我在c 中執行的好好的?沒人回答你。於是,

你只好自我安慰,這就是c++ 的保護機制吧。

我來做個總結吧,發現這個問題如果不深入研究一下,總是人云亦云,就像

我以前那樣。於是,我用bc++3.1 編譯這段**後執行,無論是編dos 程式還是

windows 程式都是能執行的,結果也和你預期的一樣。沒什麼問題。但是vc++6

執行時就會出錯,錯誤你想必相當熟悉(xx記憶體不能寫)。但這只是編譯器的問

題的嗎?

你可以把你在vc++中編譯的程式拿到純dos 下執行,哪怕他是console 程式,

他也會說「can not run in dos」,因為他是32位的。而bc++3.1 哪怕是編乙個

windows 程式,也只是16位的。所以問題的關鍵在於記憶體的管理上。32位系統對

於應用程式使用的記憶體定義了操作許可權,能讀還是能寫,或者是其他什麼。而16

位的系統缺乏這種安全機制,哪怕你說這段資料只能讀,但是寫一下也沒什麼關

系。

這種**之所以能在c 中執行的很好,就是因為那時c 的編譯器都是16位的

;現在在c++ 中不行了,是因為你用的c++ 編譯器是32位的——能找到bc++3.1

這種古董還真不容易,相對而言tc2.0 更好找。我反彙編tc2.0 生成的這兩條語

句char *p = 「hellow」;char p =「hellow」;發現他們的實現並不相同,

相對而言,char *p = 「hellow」;生成的**更簡潔一些。雖然c 也想定義常

量字串,但由於16位的欠缺保護,這種想法被人誤解了;幾乎所有學習過c 的

人都曾耗費力氣去理解如上的**,然後氾濫的使用。不為別的,只因為這種代

碼效率高,從反彙編結果能看出來。於是使用char p =「hellow」;這種語法

的人被嘲笑,但事實上,這種語法才是本意,那種語法只是鑽了個空子,於是,

在32位程式中,他被剝奪了生存的權利。

讓我想起了c 中很多怪異的寫法,雖然他們讓人很費解,但是確實,他們

的效率要比容易看懂的寫法來得高,當然,我不知道這其中有沒有鑽空子的例子

;從c 設計的本意來說,他們有存在的意義,但是從現在的程式設計潮流來看,

**的可讀性要求超過了他的效率。不知道這些語法能不能算是程式設計師中的一種

外語——想寫高效的程式嗎,掌握我吧,哪怕是死記硬背。

ps:32位系統執行16位程式採用的是模擬**的方法,就是說和執行在16位

系統一樣

C 字元 字串 字元陣列 字串指標 指標陣列

一 c 字元 字串 字元陣列 字串指標 指標陣列 前言 一 字元指標 字元陣列 二 字串指標 三 字串 指標陣列 四 常用方法 參考為了深入理解c 並時常回顧學過的知識點,對c 知識點進行記錄總結。參考1字元指標的儲存方式 字元指標變數本身是乙個變數,用於存放字元 字串的首位址。字串本身是存放在以該...

字串,字串陣列,字串指標!!

字串 字元陣列實際上是一系列字元的集合,也就是 字串 string 字串陣列 在c語言中,沒有專門的字串變數,沒有string型別,通常就用乙個字元陣列來存放乙個字串。c語言規定,可以將字串直接賦值給字元陣列 在c語言中,字串總是以 0 作為串的結束符。上面的兩個字串,編譯器已經在末尾自動新增了 0...

字元指標, 字元陣列, 字串

預備知識 c程式在記憶體中的空間占用分配 1 區 存放程式 2 資料區 a.靜態資料區 在編譯器進行編譯的時候就為該變數分配的記憶體,即全域性變數和靜態變數 用static宣告的變數 存放在這個區的資料程式全部執行結束後系統自動釋放,宣告週期貫穿於整個程式執行過程。全域性變數和靜態變數的儲存是放在一...