字串操作和一級指標記憶體模型

2021-08-11 04:26:10 字數 1123 閱讀 2364

c語言的字串是以0或者說』\0』結尾的字串

c語言實際上根本沒有字串這個資料型別,全靠編譯器來解釋源**裡面的字串,原理是用字元陣列模擬字串,只不過字元陣列的最後乙個元素是0(』\0』)

字串的記憶體分配可在堆上、棧上、全域性區、實現記憶體分配,通常字串字面常量就是在全域性資料區分配的記憶體

指定長度初始化

當初始值的個數長於指定的陣列長度時,編譯器報錯

buf3[2] = ;
當初始值的個數小於指定的陣列長度時,後面的陣列元素預設初始化為0

char buf2[100] = ;
後面的buf2[4]-buf2[99]自動初始化為 0,此時內存在棧上分配

不指定長度初始化

c編譯器會自動幫程式設計師 求元素的個數

char buf1 = ; //buf1是乙個陣列 不是乙個以0結尾的字串
編譯器自動將字串字面常量逐一賦值給陣列元素,並將最後乙個元素賦值為0

涉及到計算字串長度的函式是strlen

計算陣列長度的是操作符sizeof,陣列和指標都是特定的資料型別

char buf3 = "abcd"; /* buf3 作為字元陣列 應該是5個位元組 ,作為字串 應該4個位元組*/
陣列名是陣列首元素的位址,是乙個常量指標,不可修改;

因為編譯器要保證區域性變數記憶體首位址不變,這樣才可以在函式返回時安全釋放記憶體,否則一旦編譯器允許修改陣列名的值,則釋放記憶體的時候有可能釋放掉別的位址開頭的記憶體或者浪費一部分記憶體

當sizeof作用於陣列名的時候,返回的是整個陣列的大小

當取位址符(&)作用於陣列名的時候,返回的是整個陣列的位址,返回的資料型別對應於一整塊陣列的記憶體

的本質 :和*p 是一樣,只不過是符合程式設計師的閱讀習慣,不過寫成的效率稍微低一點,因為編譯器多一條指令將其轉換為指標與下標相加的操作,同時存在

p[i] = *(p+i)

buf5[i] ===> buf5[0+i]; ==> *(buf5+i);

void main()

字串和一級指標模型解析

1 在c語言中使用字元陣列來模擬字串,c語言沒有字串資料型別。2 c語言中的字串是以 0 結束的字元陣列 3 c語言中的字串可以在棧上 堆空間 或制度儲存區進行分配記憶體。4 strlen 求字串的長度,字串長度不包含 0 sizeof 型別 字串型別的大小時,包括了 0 一 字串的初始化 字串初始...

《C和指標》 字串操作補 字串記憶體操作

1.對於 string 0 它其實等價於 string 0 string 2.對於 strcpy函式,如果要複製的字串比老字串短,由於新字串是以nul 即 0 結尾,所以老字串最後剩餘的幾個字元也會被有效地刪除。如 char message original message strcpy messa...

字串指標操作

char s abc char ptr abc cout s cout s scout s scout s 1 s 1 cout s 1 s 1 cout s 0 s 0 cout s 0 void s 0 cout s 0 s 0 printf p n s 0 0061ff1c cout s 1 ...