您的位置:首页 > 其它

char* c和char c[]的区别

2015-11-24 10:32 375 查看
看了网上的一些文章,比如:
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风格的代码混合使用的时候要特别小心。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: