字串和一級指標模型解析

2022-09-23 12:24:08 字數 1835 閱讀 6631

1、在c語言中使用字元陣列來模擬字串,c語言沒有字串資料型別。

2、c語言中的字串是以'\0'結束的字元陣列

3、c語言中的字串可以在棧上、堆空間、或制度儲存區進行分配記憶體。

4、strlen()求字串的長度,字串長度不包含'\0',sizeof(型別)字串型別的大小時,包括了『\0』

(一)字串的初始化

字串初始化有兩種方法,預設元素個數和指定元素個數。

#define _crt_secure_no_warnings

#include

#include

#include

int main()

號法 初始化列表

//陣列初始化有2種方法 預設元素個數、指定元素個數

char buf1 = ;//若沒有指定長度,預設不分配零

//若指定長度,不夠報錯;buf長度多於初始化個數,會自動補充零

char buf2[6] = ;

char buf3[100] = ;

//char buf4[5] = ;#因為有'\0' 所以需要6個字元

printf("buf3:%s", buf3);

system("pause");

return 0;

}int main()

; //2 字串常量初始化乙個字元陣列

char buf3 = ; //結論:會補充零

char buf4 = "abcde";

char buf5[100] = "abcde";

printf(" strlen(buf5) :%d \n", strlen(buf5));

printf(" sizeof(buf4) :%d \n", sizeof(buf5));

printf(" sizeof(buf4) :%d \n", sizeof(buf4));

}(二)陣列法和指標法操作字串

字元陣列名,是個指標,是個常量指標,代表字元陣列首元素的位址,不代表整個陣列。

當我們有了乙個陣列的首位址,這個首位址是被c編譯器保護的,不能被做任何修改,因為陣列的的變數名

也就是陣列的首位址,如果一旦我們修改的首位址,那麼這個陣列就會『』找不到『』。

指標法:利用指標間接賦值,對字串進行修改,(這裡只能對棧區和堆區的字串修改,在全域性區的字

符串不可以修改) 如下**

#define _crt_secure_no_warnings

#include

#include

#include

int main()

; printf("%s\n", p);

//p[2] = 'j'; //報錯

buf[2] = '1';

printf("%s\n", buf);

system("pause");

return 0;

}我們從記憶體四區的角度對上面**進行分析,知道我們的變數的記憶體從**來到**去。

我們的**在預編譯,編譯器先會將**中所有的字串常量在全域性區進行記憶體分配,然後將其存入全域性區,此時*p 和 buf 在棧中有記憶體,但是沒有資料。

char *p ="sadfsaf";

char buf = ;

當執行上面兩句**的賦值時,我們的記憶體會做如下變化:

即此時會讓指標p指向全域性區儲存字串"sadfsaf"的首位址,會將全域性區的"adsad"字串拷貝到棧上的buf裡面。

因為buf在棧上有記憶體,我們使用buf[2] = '1' 實際上是修改棧上的buf,而不是全域性區,而p是乙個指標,*p是指標所指向的記憶體空間的值,因此p[2] ='j' 修改的是我們全域性區的記憶體資料,這在c語言裡面是不被允許的。

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

c語言的字串是以0或者說 0 結尾的字串 c語言實際上根本沒有字串這個資料型別,全靠編譯器來解釋源 裡面的字串,原理是用字元陣列模擬字串,只不過字元陣列的最後乙個元素是0 0 字串的記憶體分配可在堆上 棧上 全域性區 實現記憶體分配,通常字串字面常量就是在全域性資料區分配的記憶體 指定長度初始化 當...

一級指標和二級指標

通常用作函式的輸入引數,因為一級指標作為函式引數,在呼叫的時候,實參和形參是不同的記憶體空間,只是,這個記憶體空間存放的指標指向的是同一塊位址,所以形參在函式執行中可以訪問實參指向的記憶體空間,但是形參的指向的改變並不能影響實參。總結一句話 一級指標做函式引數,在函式內做形參做重新指向並 不會影響實...

一級指標 char 易錯模型分析

1 char 字串 做函式引數出錯模型分析 比如 如下 void copy str21 char from,char to for from 0 from to to 0 字串逆序 int main char p p null char to 100 copy str21 p,to 注意,如果傳給f...