這本來是前天寫的內容,一直拖到了現在,本來打算今天晚上寫,又怕拖到明天,現在寫了吧。該死的拖延症。
在編程的時候這塊遇到好幾次問題。而且越看越糊塗,上網查了查,自己寫一寫,看看對不對。有雷同,有改進。
字符串數組與字符串指針的區別
C中沒有字符串數據類型,一般使用數組對字符串進行各種操作。
(1)字符串指針
字符串指針是定義了一個指針變量,指針變量存儲的是某個字符串的內存首地址。他是指針變量被放在內存中的棧區。在編譯器編譯時,會自動在字符串結尾處添加結束標識符'\0'。
(2)字符串數組
字符串數組是用數組來存儲字符串。字符串數組作為變量存儲在內存中的棧區。C對於字符數組沒有硬性規定一定要在末尾處添加結束符,即可有可無。但好多字符串函數都是以結束符作為判斷的標志,所以要注意在使用字符數組時記得在末尾處添加結束符。
(3)關於字符串指針和字符串數組初始化的問題
首先解釋字符串常量。字符串常量是這靜態存儲區中的一段連續的內存,以'\0'結束。只讀,不可修改。
a.字符串指針初始化
可使用字符串常量對指針初始化,如下所示:
char *p = "hello world";
或
char *p;
p = "hello world";
使用字符串常量對指針初始化時,指針是變量存儲在內存中的棧區,字符串常量存儲在靜態存儲區,不可修改,如果修改會出現未定義錯誤。例子:
char *p = "hello world";
*(p + 1) = 'E'; //這樣的賦值是錯誤的,不能更改字符串常量
b.字符數組初始化
可使用字符串常量對數組初始化,如下所示:
char str[] = {"hello world"};
也可以對數組單個元素初始化,如下所示:
char str[] = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};
使用字符串常量對數組初始化時,數組作為變量存儲在內存中的棧區,字符串作為元素值被放在數組所分配的內存空間中。且可對數組元素進行修改。
char str[] = {"hello world"};
str[0] = ’H'; //這樣的操作是正確的
(4)字符串數組中的結束符問題
C對於字符數組沒有硬性規定一定要在末尾處添加結束符。
a.當表明數組大小時,
char str[4] = {"Good"};
b.當未表明數組大小時,
char str[] = {"Good"};
即 char str[0] = {'G'}; char str[1] = {'o'}; char str[2] = {'o'}; char str[3] = {'d'}; char str[4] = {'\0'};
上述是表明數組大小與未表明數組大小編譯器的方式
(5)使用指針時要防止出現段錯誤,防止指針指向內存中不明空間。
當一個指針變量在未取得確定地址前使用是危險的,容易引起錯誤。
一個錯誤的例子,如下:
char *name;
scanf("%s",name);
printf("%s",name);
有的編譯器雖然也能通過,但這是錯誤的,因為是個指針,定義時指向不可用的地址。解決這個問題有兩種方法:用數組的方法或給字符針針分配內存空間的方法。
數組的方法:
char name[20];
scanf("%s",name);
printf("%s",name);
給字符針針分配內存空間的辦法:
char *name;
name=(char*)malloc(50); //此時name已經指向一個剛剛分配的地址空間。
scanf("%s",name);
printf("%s",name);