2018 5 25字串常量與字串變數

2021-08-20 06:22:35 字數 2036 閱讀 3983

/*本質上我是不想搞清楚這些奇奇怪怪的東西的,都是奇奇怪怪東西 0-0 -__-*/

下面是來自各個地方關於這個解釋,大家瞅著那個看上去比較合理就接受那乙個吧,突然感覺陣列和指標是不一樣的。

char *s1="helloworld";

char s2="helloworld";

首先s1[0]='t';這是不對的啦,s1裡的內容是不能修改的。然後s2[0]='t'是可以的,s2裡的內容可以修改。修改下:**完全是合法的,編譯器不會抱錯,但程式執行會segmentation fault,因為.rodata和.text一樣是作業系統保護唯讀的。這就是標準中所說的未定義行為。實際中大部分作業系統(沒有測試過)應該都會按照記憶體越權訪問處理。

first statement :常量就是固定不變的量,不能通過函式進行修改的變數;變數是可以通過賦值,函式等手段進行修改的乙個變數。

字串常量:char *a = "hello world";首先,作業系統在編譯器規劃記憶體方案中的的文字常量區分配一段記憶體,儲存"hello world"字串,然後在棧區分配乙個記憶體,儲存"hello world"字串所在記憶體的首位址,字串常量一旦分配是不允許修改的。

字元常量:char b = "hello world";作業系統在編譯器規劃的記憶體方案中的棧區分配一段連續記憶體空間(12個位元組),儲存"hello world"字串,字串常量就相當於字元的乙個陣列,是可以修改的。字串常量:char *a = "hello world";首先,作業系統在編譯器規劃記憶體方案中的的文字常量區分配一段記憶體,儲存"hello world"字串,然後在棧區分配乙個記憶體,儲存"hello world"字串所在記憶體的首位址,字串常量一旦分配是不允許修改的。

字元常量:char b = "hello world";作業系統在編譯器規劃的記憶體方案中的棧區分配一段連續記憶體空間(12個位元組),儲存"hello world"字串,字串常量就相當於字元的乙個陣列,是可以修改的。

secound statement: 字串指標變數本身是乙個變數,用於存放字串的首位址。而字串本身是存放在以該首位址為首的一塊連續的記憶體空間中並以『\0』作為串的結束。字元陣列是由於若干個陣列元素組成的,它可用來存放整個字串。【我覺得這個解釋比較正常的樣子】

third statement:字串變數是存放字串常量的變數,其取值是字串常量,即字串。

字串常量是用雙引號括起來的乙個字串。

char s="s";

s就是字串變數,"s"就是字串常量。【這個解釋也很正常的樣子】字串常量是用雙引號括起來的乙個字串。

char s="s";

s就是字串變數,"s"就是字串常量。【這個解釋也很正常的樣子】

繼續尋找滿意的答案。。。

int i=1;這裡的1也算常量,為什麼不放在.rodata區(常量區)呢,

這是因為編譯器認為普通的整型、浮點型或字元型常量在使用的時候是可以通過立即數來實現的,沒有必要額外儲存到資料區,如此節省了儲存空間和執行時的訪問時間。那麼什麼樣的資料才將放入常量區呢?【此處需要看彙編了,我看了半天就看明白了push %rbp :)】複雜的問題繼續尋求答案……

字串常量:不能對值修改。  常量:char *str = "abcdef"、"\n"

字串變數:能對值修改 。    變數:char c = "a"、char arr = "abc"

記住結論吧,溜了,,,,,說明彙編很重要啊 暫時不研究這個玩意了,很想把c語言發明者找來修改下這些奇奇怪怪規則但是 好像已經仙去了。

------------------還是沒有明白 明白了一點點,看到下面的話又不明白了

char *s1 的 s1 是指標,而指標是指向一塊記憶體區域,它指向的記憶體區域的大小可以隨時改變,而且當指標指向常量字串時,它的內容是不可以被修改的,否則在執行時會報錯。

char s2 的 s2 是陣列,對應著一塊記憶體區域,其位址和容量在生命期裡不會改變,只有陣列的內容可以改變。

字串 3 字串與函式

字串處理函式,及如何正確返回處理結果?char fun char str str abcde return str void main char str1 10 char str2 fun str1 cout 知識點 1 abcde 儲存在常量區 並非簡單區域性變數,區別於區域性變數陣列 所以可以返...

字串常量與字串陣列

1 對於 字串,必以 0 結尾,如果是雙引號會在它所包含內容後面自動加乙個 0 且會佔據位元組數。2 字元陣列中若不指定長度,系統會自動分配 char str1 abcde 1,字串常量 char str2 abcde 2,字元陣列,在分配位元組時會在最後加上 0 3 字串 常量的值 不能被修改 因...

常量,字串常量

對於普通變數常量 常量摺疊 是 就是在編譯器進行語法分析的時候,將常量表示式計算求值,並用求 得的值來替換表示式,放入常量表。可以算作一種編譯優化 include void main 輸出 3 2 我只是改了這個位址內容,但是e還是2,因為編譯器在優化的過程中,會把碰見的const全部以內容替換掉 ...