来自于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];快的原因,少了一条指令嘛