转评一贴文章: c++中char * 和 char []的区别

来自于cqcmdwym 的blog:http://blog.csdn.net/cqcmdwym/archive/2006/10/15/1335614.aspx

demo程序

#include <iostream>
using namespace std;

main()
{
   char *c1 = "abc";
   char c2[] = "abc";
   char *c3 = ( char* )malloc(3);
   c3 = "abc";
   printf("%d %d %s/n",&c1,c1,c1);
   printf("%d %d %s/n",&c2,c2,c2);
   printf("%d %d %s/n",&c3,c3,c3);
   getchar();
}  
运行结果
2293628 4199056 abc
2293624 2293624 abc
2293620 4199056 abc

DEMO2:
void main()
{
char a=1;
char c[]="1234567890";
char *p="1234567890";
a = c[1];
a = p[1];
return;
}

偶的回贴:

代码稍为改一下:

1. char *c1 = "abc";
2. char c2[] = "abcd";
3. char *c3 = ( char* )malloc(4);
4. c3 = "abc"
5. strcpy(c3,"1234");
6. c3[0] = 'g';


分析:
1。上面代码中的 字符串常量 "abc","abcd","1234",都是存放在所谓的文字常量区;
2。c1,c2,c3 这个三变量,都存放在栈中

3。在VC中测试,CPU4个字节对齐吧,EBP为栈顶指针

c1 的地址,就是ebp - 04h,占用4个字节
c2 的地址,就是ebp - 0ch,占用8个字节
c3 的地址,就是ebp - 10h,占用4个字节

4。存储内容比较
c1 的4个字节,保存是的字符串常量 "abc"的地址
c2 的8个字节,保存就是就"abcd/0"还有3个字节未用;它不保存字符串常量 "abcd"的地址,而是将内容复制过来

c3和c1一样,也是保存一个地址,但这个地址,是在堆中,

结论:
所谓c++中char * 和 char []的区别

char * 在栈中是4个字节的指针,
而 char []将在栈中申请合适的内存来保存初始化的数据,

也就是说
char c2[]="abcd"; 和char c2[5]="abcd";一样的;
若char c2[n],则在栈中分配n个字节;

所以c2[1]='0'是正确的,c1[1]='a'是错误的,因为字符串常量不允许修改;

同时也说明了上面的代码
...
char a=1;
char c[]="1234567890";
char *p="1234567890";
a = c[1];
a = p[1];
...

a = c[1];要比a = p[1];快的原因,少了一条指令嘛

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值