c++ char *和char []的区别
一、先看一段程序
1 #include <stdio.h> 2 #include <stdlib.h> 3 using namespace std; 4 int main() 5 { 6 char *c1 = "abc"; 7 char c2[] = "abc"; 8 char *c3 = (char*)malloc(3); 9 c3 = "abc"; 10 printf("%d %d %s %c\n",&c1,c1,c1,*c1); 11 printf("%d %d %s %c\n",&c2,c2,c2,*c2); 12 printf("%d %d %s %c\n",&c3,c3,c3,*c3); 13 getchar(); 14 }
运行结果为
2272348 4202624 abc a
2272344 2272344 abc a
2272340 4202624 abc a
二、可见:
1、这几个字符串的地址&c1,&c2,&c3都不相同,但是char *c1 = "abc"和 c3 = "abc"中c1,c3的地址是相同的。
这是因为char *c1 = "abc"中,定义了一个字符串常量,存放在global区域。当编译c3 = "abc"时,并没有再生成一个 "abc"字符串,而是在常量区中找到这个字符串,让c3指向它。
即 char c[] 把内容存在stack , char *c 则把指针存在stack,把内容存在constants.
2、char c2[] = "abc";c2、&c2的值是一样的。
3、 printf("%d %d %s %c\n",&c1,c1,c1,*c1); 结果: 2272348 4202624 abc a
&a 表示a的地址 .
a 表示a存储的内容, 因为a是指针, 所以它的内容读取出来就是一个地址 .
*a 表示a指针存储的这个地址存储的内容 .
ps: *c3="abc"是错误的写法。c3是指针变量,所指的内容是char型。实际上*c3='a'。
c3 = "abc";这样就没问题了。但此时,c3存储的就是的字符串常量的地址了,所以不能再给c3所指的内容赋值了:c3[0] = 'g';是非法的;
此外,函数在压栈,一般是先把参数(arguments)压栈,然后才是返回地址。