C語言中有兩種方法可以存放字符串,但是它們卻有區別。本文是看看書上以及網上的一些博客然後總結一下,一孔之見。
(1)分配內存位置的區別
char *p=“word”;//“word\0”被分配在字符串常量存儲區存儲區,所以如果對p[0]=‘x’是錯誤的。
char str[10]="word\n";//“word\0”被分配在棧空間中的,所以如果p[0]=‘x’是沒有問題的。
注:在棧空間分配內存的變量,是不能用來做函數參數參數返回的。因爲在函數調用結束後,函數中的變量(棧空間分配)都被銷燬了,返回值是一個不確定的值。
(2)sizeof與strlen區別
例1:(字符指針沒有隱含數組長度的概念)
char *p="wordlength";sizeof(p)=4,;//因爲p只是一個字符指針,它所指的區域存儲了字符串,但是編譯器指示將其當作指針處理;
但是,如果strlen(p)=10;//strlen是一個函數操作,以'\0'爲標準去計算字符串的長度,'\0'沒有算進去
例2:(字符串隱含了一個字符串數組的長度概念)
char p[20]="wordlength";sizeof(p)=20*sizeof(char)=20,;//因爲p是一個字符串,是一個數組,這是一個隱形長度的概念在裏面,但是如果當作函數時又退化爲指針。
char p[]="wordlength";sizeof(p)=11;//p是一個字符串,一個數組,雖然沒有給出長度,編譯器會自動算出長度,這裏爲什麼是11,因爲在字符串的結尾有一個額外的'\0'。
但是,如果strlen(p)=10;//strlen是一個函數操作,以'\0'爲標準去計算字符串的長度,'\0'沒有算進去。
sizeof(*p)=1;//*p是第一個字符串的第一個字母
(3)字符指針可以指向一個字符串
char *str=”china“;//C語言中對字符串常量按照字符數組處理的,在內存中開闢了一個字符數組來存放該字符串常量。對str的初始化,其實就是將把該內存中的第一個元素地址賦給了str。
上面的定義可以拆成下面兩行:
char *str;
str = ”china“;//讓str指向china這個存儲空間
但是不能這樣:
char *str;
*str=”china“;//str都沒有指向任何空間,這樣賦值顯然是不對的。
(4)用scanf的時候注意
例1: char str[10];
scanf("%s",str);//這樣輸入時沒有問題的,在編譯的時候str已經分配了空間,其地址是確定的
例2: char *str;
scanf("%s",str);//這樣是不對的,str沒有指向確定的空間,這樣是一個很危險的一個操作
(5)字符串的指針值是可以改變的
char *str="china";
str=str+1;//這是沒有問題的
char c = *str ;//我們可以通過取地址操作獲得字符串的某個字符
*str = ‘c’;//但是我不能修改str裏面的內容,因爲str指向的空間在字符串常量空間分配的,無法改變。
注:但是一般的數組名雖然代表地址,但它卻是常量,它的值是不能改變的。
(6)char *str = “lsj”;//不需要釋放內存
char *str = new char[strlen(1)+1];//需要釋放內存