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风格的代码混合使用的时候要特别小心。
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风格的代码混合使用的时候要特别小心。
相关文章推荐
- 数据库三大范式
- linux 进程学习笔记-进程状态
- linux 进程学习笔记-进程调度
- ArcGIS 10.1 for flex 4.6
- Zookeeper
- 使用haxe时出现Custom(std@socket_recv)错误
- 《启示录》阅读笔记(五)——第二部分(流程)——评估产品机会
- G1垃圾收集器入门
- Java类中重写equals()方法
- 动态改变布局
- ssh架构搭建
- select标签和GET提交参数互相影响
- Java的典型特点
- UVa 11231 - Black and white painting
- Android-Fragment动态例子
- python 列举文件夹下文件并排序
- C++二叉搜索树的实现
- python stdout 重定向
- 所谓的成熟,就是不抱怨
- Asp.Net 之 调用远程Web_Service