字符串数组和字符串指针的区别联系

一、区别


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

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