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)压栈,然后才是返回地址。