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

2021-09-11 02:51:32 字數 1598 閱讀 1018

預備知識: c程式在記憶體中的空間占用分配

(1)**區:存放程式**;

(2)資料區

a.靜態資料區: 在編譯器進行編譯的時候就為該變數分配的記憶體,即全域性變數和靜態變數(用static宣告的變數),存放在這個區的資料程式全部執行結束後系統自動釋放,宣告週期貫穿於整個程式執行過程。全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域(.data),未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域(.bss)。

b.堆區:這部分儲存空間完全由程式設計師自己負責管理,它的分配和釋放都由程式設計師自己負責。這個區是唯一乙個可以由程式設計師自己決定變數生存 期的區間。可以用malloc,new申請對記憶體,並通過free和delete釋放空間。如果程式設計師自己在堆區申請了空間,又忘記將這片記憶體釋放掉,就 會造成記憶體洩露的問題,導致後面一直無法訪問這片儲存區域。但程式退出後,系統自動**資源。分配方式倒是類似於鍊錶。

c.棧區:存放函式的形式引數和區域性變數,由編譯器分配和自動釋放,函式執行完後,區域性變數和形參占用的空間會自動被釋放。效率比較高,但是分配的容量很有限。

d.常量區: 存放常量的區間,如字串常量等,注意在常量區存放的資料一旦經初始化後就不能被修改。 程式結束後由系統釋放。

字串:字串是乙個以'\0'結尾的字元陣列, 實際上在c語言中沒有字串這種資料型別

字元指標: 字元指標是乙個指向字元的指標

字元陣列:字元陣列是元素為字元的陣列

關於字串賦值的例子: 以下示例中1,2,3是正確的, 而4是錯誤的

1.

char *p1 = "123";

2.char p2 = "123";

3.char *p3;

p3 = "123";

4.char p4[10];

p4 = "123";

對於示例1和示例3, 雙引號做了3件事:  

1.申請了空間(在常量區),存放了字串 

2.在字串尾加上了'/0'

3.返回位址

對於示例2:

1.申請空間(在棧空間) ,存放字串

2.在字串尾加上了'/0'

關於常量空間還是棧空間分配的乙個示例

/**

* 錯誤寫法, 因為字串1234567是在常量池中儲存, 不能被修改, 所以第二條賦值語句錯誤

*/void test16()

/** * 正確,對比test16(),用陣列的形式初始化字串,1234567是儲存在棧記憶體中的

*/void test17()

strcpy和memcpy主要有以下3方面的區別。

1、複製的內容不同。strcpy只能複製字串,而memcpy可以複製任意內容,例如字元陣列、整型、結構體、類等。

2、複製的方法不同。strcpy不需要指定長度,它遇到被複製字元的串結束符"\0"才結束,所以容易溢位。memcpy則是根據其第3個引數決定複製的長度。

3、用途不同。通常在複製字串時用strcpy,而需要複製其他型別資料時則一般用memcpy

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

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

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

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

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

一 字串可以賦值給字元指標變數 char p hello 其實這裡分配了常量,即const,如果不讓p指向別的位址就無法修改。char q world cout p q 1.字串常量 hello 出現在乙個表示式中時,hello 表示式使用的值就是這些字元所儲存的位址 在常量區 而不是這些字元本身。...