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...