在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函数进行赋值或用循环赋值 字符串指针:允许声明后的赋值
字符串指针不能用cin输入
char *p; cin>>p;会报错,而字符串数组不会。
对于初始化后的字符串数组和字符串指针,我希望更改第二个元素
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都是首字母地址