字符串數組和字符串指針的區別聯繫

一、區別


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都是首字母地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章