一、区别
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都是首字母地址