看了网上的一些文章,比如:
http://www.cnblogs.com/kaituorensheng/archive/2012/10/23/2736069.html
其实总结起来就是一句话,char *就是一个指针,char c[]是一个数组,但是c可以有些指针的用法。
1.char *
char * c中,c是一个字符指针,它可以拥有栈内存,也可以拥有静态内存。具体看它指向的是什么了。
比如
char a = 'a';
char *c = &a;
这时c就拥有栈内存,它指向栈中的一个字符变量。
char *c = "abcdefg";
这时c拥有静态内存,因为它指向字符串常量“abcdefg”中的第一个字符'a'
2.char c[]
这里c声明了一个数组,肯定是放在栈内存区域的。
c在这里只是拥有类似于一个字符指针的行为(比如*c可以访问数组最开始那个元素),它并不是一个char *,此时c的类型是char[]。
由以上1和2两点就能很明白地弄清这两者在使用中上面的区别与注意事项了。
①当char *指向常量字符,无法更改指向的内容。
这个时候,不可更改char *指向的内容。
比如
char * x = "abc";
*x = 'x';
是会出错的。
相比而言,如果是指向一个栈内存,则怎么改都无所谓。
②char *完全可以更改指向谁。
char * x = "abc";
char y[20] = "hello";
x = y;
既然char *是一个指针,你向让它指向谁就指向谁啊。如果你继续让它指向一个常量,就不能更改指向的对象。
但是如果你已经改变它指向一个栈内存中的对象,就可以通过它更改指向的对象了。
③char c[]不能将c完全当做指针。
如果c仅仅是一个指向数组第一个元素的指针,那么我可以让c重新指向一个字符。
char c[20] = "hello";
char x = 'x';
c = &x;
不过这是不行的,归根结底还是因为c就是一个char []类型。不能将char *赋值给char [],就算是另一个一样长度的char []也不能这样赋值。
注意事项,
以上提到的都是它们本身是什么类型,和最终输出什么没有一定的关系。
一个字符指针,你可以将其当做字符串输出。
而cout就会将其当做字符串输出。
比如
char a[20] = "hello";
char x = 'x';
char *c = &x;
cout << c << endl;
我在codeblocks,用G++4.8.1编译器,
这样运行的结果,是xhello,也就是说,尽管c是字符指针,但是它指向的对象和a代表的对象在栈内存中挨着了,如果处理为字符串,它们就是一个字符串。
所以在C++和C风格的代码混合使用的时候要特别小心。