用字元陣列和字元指標變數都可實現字串的儲存和運算。但是兩者是有區別的。在使用時應注意以下幾個問題:
1.字串指標變數本身是乙個變數,用於存放字串的首位址。而字串本身是存放在以該首位址為首的一塊連續的記憶體空間中並以『\0
』作為串的結束。字元陣列是由於若干個陣列元素組成的,它可用來存放整個字串。
2.對字串指標方式,char *ps=」c language」;
可以寫成char *ps;ps=」c language」;
而對於陣列方式,char st=;
不能寫成char st[20];
st=;
只能對字元陣列的各元素逐個賦值。
由此可以看出使用字串指標變數和字元陣列在使用上的區別,同時可以看出使用指標變數剛方便。
但是指標變數在未取得確定位址前使用很危險。
當乙個指標變數在未取得確定位址前使用是危險的,容易引起錯誤。
乙個錯誤的例子,如下
:
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);
但是對指標變數直接賦值是可以的。因為c系統對指標變數賦值時要給以確定的位址。
3.int main()
陣列和指標都可以在它們的定義中用字串常量進行初始化,儘管看上去一樣,底層的實現機制卻不相同。
定義指標時,編譯器並不為指標所指向的物件分配空間,它只是分配指標本身的空間,除非在定義的同時賦值給指標乙個字串常量進行初始化。例如:下面的定義建立了乙個字串常量(為其分配了記憶體):
char *p=」
abcdefg」;
注意只有對字串常量才是如此,不能指望為浮點數之類的常量分配空間,如:
float *p=3.14; /*錯誤,無法通過編譯*/
下面結合乙個例項談談初始化指標時建立的字串常量與陣列中的字串的區別:
在ansi c中,初始化指標時所建立的字串常量被定義為唯讀。如果試圖通過指標修改這個字串的值,程式就會出現未定義的行為。在有些編譯器中,字串常量被存放在只允許讀取的文字段中,以防止它被修改。
陣列也可以用字串常量進行初始化:
char a=」
abcdefg」;
如指標相反,由字串常量初始化的陣列是可以修改的。其中的單個字元在以後可以改變。
其中,如果採用char *test=」
abcdefghijklmn」;
會產生執行時錯誤。
char test=
」abcdefghijklmn
」則程式正常執行,原因如前所述。
字串 字串陣列 字元陣列的區別
string a newstring 字串 string a newstring 5 字串陣列 char a newchar 5 字元陣列 string a newstring abc 字串 string a newstring 字串陣列的賦值 string a 字串陣列的初始化 char a ne...
字串陣列與字串指標的區別
字元指標變數和字元陣列的區別 簡單說一下 字串陣列是用來存放字串的陣列,在記憶體中佔一段連續的單元。所佔記憶體存放的是字串。定義方法為 char a n n為常量表示式,可初始化。字元指標是指向字元的指標,所佔記憶體單元存放的是所指字元的記憶體單元。定義方法為 char p 完整的解答 1 字元陣列...
字串指標與字元陣列的區別
用字元陣列和字元指標變數都可實現字串的儲存和運算。但是兩者是有區別的。在使用時應注意以下幾個問題 字串指標變數本身是乙個變數,用於存放字串的首位址。而字串本身是存放在以該首位址為首的一塊連續的記憶體空間中並以 0 作為串的結束。字元陣列是由於若干個陣列元素組成的,它可用來存放整個字串。對字串指標方式...