char数组 、char指针与字符串常量的比较

本文详细解释了在C++中如何正确地比较字符串。通过对比字符指针与字符串字面量的区别,阐述了两者地址的不同之处,并介绍了使用strcmp()函数进行内容比较的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组不是基本类型,不能直接参与比较,数组与字符串及字符指针与字符串比较其实比较的是二者的地址。

例:

[cpp]  view plain  copy
  1. int isequiv(char *t)  
  2. {  
  3. if (t == "char")  
  4. return 1;  
  5. else  
  6. return 0;  
  7. }  
  8.   
  9. int main()  
  10. {  
  11. char test[] = "char";  
  12. char *temp = "char";  
  13. printf("%d", isequiv(test));//输出 0  
  14. printf("%d", isequiv(temp));//输出 1  
  15. return 0;  
  16. }  

那么为甚么test与temp同字符串“char”比较时结果会不一样呢?其实t=="char"比较的是地址!

首先,当你这么引用一个字符串的时候 "char",它表示存储在程序的常量区的一串字符串,它返回的就是这个常量区的字符串地址比如假设这个地址是 0x004038b0 "char",那么当你使用 char *temp = "char";的时候,temp就得到了这个常量字符串的地址,也就是temp等于 0x004038b0  
或许你可以试试
[cpp]  view plain  copy
  1. char* p1 = "char";  
  2. char* p2 = "char";  
  3. char* p3 = "char";  
  4. char* p4 = "char";  
 
这里的 p1 p2 p3 p4 的值都一样,都是指向常量区字符串 "char", 比如上面的 0x004038b0  
然而当你这么只用的时候 
char test[] = "char";  
这里情况就和上面的不一样了,这样写的时候,编译器并不是让test也指向常量区的字符串"char",而是在本地堆栈分配了一段和"char"一样大的空间,如何把常量区字符串"char" 拷贝到test
 
可以这么理解
char* p1 = "char"; p1 和 常量区的"char"是同一个东西,地址相同
char test[] = "char"; test和 常量区的"char"不是同一个东西,但是内容相同
[cpp]  view plain  copy
  1.    
  2. int isequiv(char *t)   
  3. {   
  4. if (t == "char")   
  5. return 1;   
  6. else   
  7. return 0;   
  8. }  

以上面为例子
 
当你这么比较的时候  if (t == "char") 编译器是去比较t和"char"是不是同一个东西,它们的值(字符串的地址)是不是一样,而不是比较它们的内容是不是一样
 由前面的讲解可以知道
char* p1 = "char";    p1 和"char"的值是一样的
char test[] = "char";  test 和 "char"的值不一样,只是它们指向的字符串内容一样而已
 要比较两个字符串的内容是不是一样,用 strcmp()返回0就是一样
 比如,你那个函数可以改为
 
[cpp]  view plain  copy
  1. int isequiv(char *t)   
  2. {   
  3.     if (strcmp(t, "char") == 0)   
  4.         return 1;   
  5.     else   
  6.         return 0;   
  7. }   

ps:你要理解两个感念,
 
同一个东西
内容相同的两个东西

注:字符串比较用用strcmp()函数,strcmp(test,"char")及strcmp(temp,"char")!

转自: http://bbs.youkuaiyun.com/topics/300002842
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值