一、區別
1、初始化
char x[10]="abc";
char* q="abc";
在VS2013編譯器下,字符串數組和指針均可以按照如上方式進行初始化賦值,但對內存的方式不盡相同,參照下面的例子進行記憶
int main()
{
char x[10] = "abc";
char y[10] = "abc";
char* q="abc";
char*p = "abc";
printf("x爲%s,地址爲%p\n", x,x);
printf("y爲%s,地址爲%p\n", y, y);
printf("q爲%s,地址爲%p\n", q, q);
printf("p爲%s,地址爲%p\n", p, p);
}
結果如圖:
這說明:
字符串數組:有自己專屬的內存空間,
字符串指針:指向程序運行時,在內存中創建的“abc”長字符串的首地址,即公用常字符串的地址
對於以下代碼
int main()
{
char name[100];
char *k;
name="jlkjsj" //不能通過編譯
k = "aaaaaa"; //no problem
cout << k << endl;
system("pause");
}
說明:
字符串數組:一經初始化後不能再直接賦值,除非用strcpy函數進行賦值或用循環賦值
字符串指針:允許聲明後的賦值
2、cin輸入
字符串指針不能用cin輸入
char *p;
cin>>p;
會報錯,而字符串數組不會。
3、元素的更改
對於初始化後的字符串數組和字符串指針,我希望更改第二個元素
int main()
{
char name[100]="abc";
char *k="abc";
k[1] = 'k'; //編譯通過,但是程序會報錯
name[1] = 'k'; //更改後k="akc"
cout << name << endl;
cout << k << endl;
system("pause");
}
上面的例子說明:
字符串指針:k爲指向一塊常字符串”abc”,所以不可更改其值
字符串數組 : 自己獨立的內存,可以更改
所以:
int main()
{
char name[100]="abc";
char *k;
k = name;
name[1] = 'k';
cout << name << endl;
cout << k << endl;
system("pause");
}
k和name都爲”akc”
二、聯繫
對於以下代碼:
int main()
{
char x[10] = "abc";
char*p = "abc";
cout << x << " " << *x << " " << &x << endl;
cout << p << " " << *p << " " << &p << endl;
}
用流輸出時候x和p均爲字符串內容,*x和*p都是字符串首地址內容,&x和&p都是首字母地址