char[] 和char *的区别??

nizainade 2010-07-16 11:21:10
char str1[] = "hello";
char str2[] = "hello";

//char * str1 = "hello";
//char * str2 = "hello";


const char str3[] = "hello";
const char str4[] = "hello";

const char* str5 = "hello";
const char* str6 = "hello";

cout<<(str1 == str2)<<endl;
cout<<(str3 == str4)<<endl;
cout<<(str5 == str6)<<endl;

上面分别输出0,0,1如果把char []换成char* 就都相等了,在定义时有什么区别吗?

另:char[] 和char* 还有什么区别? 是不是在传递给char [] 参数时,自动转换char* ??
...全文
176 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
shihunjiangjie 2010-07-17
  • 打赏
  • 举报
回复
经典透彻[Quote=引用 6 楼 wyz007134 的回复:]

C/C++ code

char str1[] = "hello ";
char str2[] = "hello ";
cout < <(str1 == str2) < <endl; // str1和str2是两个字符数组,既然是两个数组,就理所当//然拥有不同的存储空间,只不过他们存储的内容相同罢了;进行数组名的比较,此处数组名退化为指针,//也就变成了……
[/Quote]
e_sharp 2010-07-17
  • 打赏
  • 举报
回复
数组名本身代表数组的首地址,==判断的是地址是否相同。
zhangweiit 2010-07-17
  • 打赏
  • 举报
回复
char [] 将会在函数的栈空间上开辟内存,而且是线性开辟,因此他们肯定地址不一样的

当char* 直接指向一个字符常量的时候,编译器会做一些特殊工作,
因为编译器已经把字符常量存在一个专门的存储区,作为一个列表
在这个列表中,是不会有重复的条目的
遇到char *指针的时候,会去找这个列表,如果有相同的字符串,那肯定指向同一个条目
于是,地址就一样了
e_sharp 2010-07-17
  • 打赏
  • 举报
回复
const char* str5 = "hello ";
const char* str6 = "hello ";
str5,str6 都是指向静态存储区,地址相同;

char[] 是在栈上,地址不同
nizainade 2010-07-17
  • 打赏
  • 举报
回复
多谢 wyz007134!!

说的很详细,不过问一下:

”进行数组名的比较,此处数组名退化为指针“

字符数组是不是在某些时候就转换为指针?? 比如这里==操作,还有作为函数参数传递,是否还有其他情况??

mskmc_mc 2010-07-17
  • 打赏
  • 举报
回复
太明显了,一个是数组,一个是指针
cout < <(str1 == str2) < <endl; //数组的地址进行了比较,两个数组不同地址,但内容相同
cout < <(str3 == str4) < <endl; //同上
cout < <(str5 == str6) < <endl; //这是C风格字符串进行比较,它们都指向"hello "
"hello "
nizainade 2010-07-17
  • 打赏
  • 举报
回复
感谢各位热心回复,结贴!
liutengfeigo 2010-07-17
  • 打赏
  • 举报
回复
我的编译器会死掉
starcat 2010-07-17
  • 打赏
  • 举报
回复
char*也可以修改字符值的,编译器不认为是错误
char* p = "hello";
p = 'J';
p[3] = 'L';
cout << p << endl;
mochhk 2010-07-17
  • 打赏
  • 举报
回复
顶一下~~
wyz007134 2010-07-16
  • 打赏
  • 举报
回复
面分别输出0,0,1如果把char []换成char* 就都相等了,在定义时有什么区别吗?
char[]是数组,在定义的时候就被分配好空间了
char* 是指针,不显示分配或者只想一块内存的话,本身是没有空间,不能存放数据的。

另:char[] 和char* 还有什么区别? 是不是在传递给char [] 参数时,自动转换char* ??
数组名可以看做指针来用
char a[10]; cout << *a << *(a + 4); 是允许的
同样
char *b = a; cout << b[0] << b[4];也是允许的,不过在这句中,数组名a退化为指针,然后把数组的首地址,即a[0]的地址&a[0]赋给b

数组作为参数传递给函数时,在函数内会退化为指针,所有类型的数组都是,最明显的例子是
void foo(char a[100])
{
char b[50];
cout << sizeof(a) << endl;
cout << sizeof(b) << endl;
}
wyz007134 2010-07-16
  • 打赏
  • 举报
回复

char str1[] = "hello ";
char str2[] = "hello ";
cout < <(str1 == str2) < <endl; // str1和str2是两个字符数组,既然是两个数组,就理所当//然拥有不同的存储空间,只不过他们存储的内容相同罢了;进行数组名的比较,此处数组名退化为指针,//也就变成了地址的比较,所以不相等,输出0

const char str3[] = "hello ";
const char str4[] = "hello ";
cout < <(str3 == str4) < <endl;
//str3和str4是两个常字符数组,也是两个数组,所以下面的比较输出也是0,因为地址不相等;
//这里常字符数组的意思是数组储存的元素,也就是hello 串被规定为一个const也就是常串,不能修改其中//的内容,例如str3【0】 = ‘a’这样的语句是非法的。

const char* str5 = "hello ";
const char* str6 = "hello ";
/*
or char * str7 = "hello"; char * str8 = "hello";
*/
// 上述56或者78的组合输出都是1,因为这里他们确实相等,与数组不同,56是两个字符指针,他们指向一块//内存空间,但是并没有给它们new内存,所以它们只是指向一段内存,但是本身并不拥有这段内存,这块内//存中存放的是常串“hello ”,因为是常串,所以在内存中只有一份,所以56指向同一块内存;
//
//56和78的区别是前者是const char* 类型指针,而后者是char*型指针。类型不同
cout < <(str5 == str6) < <endl;

qiutian1949 2010-07-16
  • 打赏
  • 举报
回复
char str2[] = "hello";
生成一个字符型数组,动态分配字符串的长度,由后面的内容长度决定.
char *str3 = "hello ";
直接内存分配并存后面的字符串,str3就等于这块内存的首地址,即第一个字符的地址
由于数组名默认是数组所占内存的首地址,即相当于数组内第一个字符的首地址.
所以这里的str2和str3的意义上来说是等同的.
但是数组名默认是数组所占内存的首地址 这一点在大部分编译软件里默认,但不排除有些会不同,所以取第一个字符的地址最好还是用&str2[0]
liutengfeigo 2010-07-16
  • 打赏
  • 举报
回复
这个帖子前面不是有人发了吗?
难到你们都去一个公司?
maggice 2010-07-16
  • 打赏
  • 举报
回复
例子中的str1,str2,str3,str4都是char指针,做比较时会比较指针值,因此不相等。而str5,str6分别表示一个字符串,用==操作符时,会调用字符串比较函数,因此结果相等。
liutengfeigo 2010-07-16
  • 打赏
  • 举报
回复
const char* XXX = "YYYYYYY "; //这个叫字符串字面常量,存常量区的。
Yanger_xy 2010-07-16
  • 打赏
  • 举报
回复
char[] 和char*
前者是数组,后者乃指针.

是不是在传递给char [] 参数时,自动转换char* ??

作为参数传递进去的时候,字符数组被当做指针(32位机器占四个字节,LZ可以在函数当中用sizeof测试一下),
因此当数组作为函数的参数的时候不比指明数组的大小,即使指明了其大小,编译器也不会理会.

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧