C语言中内容相同的char*指针用==比较是否是比对地址?
C语言char*指针比较问题解答
核心结论
- 是的,在C语言中对两个指针直接使用
==运算符进行比较时,永远是在比较二者存储的内存地址值是否相等,不会比较指针指向的内存空间存储的内容。
底层逻辑原因
指针在C语言中的本质就是一个存储内存地址的整型变量,==运算符作用于指针类型时的原生语义就是判断两个地址的数值是否相等,和普通int类型变量用==比较数值的逻辑完全一致。
测试代码现象说明
你示例代码中两个char*指向相同字符串字面量时==判断为真,是因为C标准允许编译器实现字符串字面量池优化:编译器可以将程序中出现的所有内容相同的只读字符串字面量合并存储在同一块只读内存区域,此时所有指向这个字符串字面量的指针都会拿到同一个地址,所以判断结果为真。
注意:这个优化是编译器可选的实现,不是C标准的强制要求,不同编译器、不同编译参数(比如GCC关闭
-fmerge-constants选项时)都可能出现两个相同内容的字符串字面量存储在不同地址的情况,绝对不能依赖==比较指针的结果来判断字符串内容是否相等。
另外你提供的测试代码里printf("str5: %s\n", str5, str5);多传入了一个str5参数,格式化字符串仅需要1个与%s匹配的参数,多余参数不会引发运行错误但属于无效传参,可以删掉第二个str5。
正确的字符串内容比较方式
如果需要判断两个字符串的内容是否一致,需要引用<string.h>头文件,使用标准库函数strcmp比较:
#include <stdio.h> #include <string.h> int main() { char* str5 = "hold"; printf("str5: %s\n", str5); char* str6 = "hold"; // 比较地址 if (str5 == str6) { printf("str5 and str6 point to the same address\n"); } else { printf("str5 and str6 point to different addresses\n"); } // 比较内容 if (strcmp(str5, str6) == 0) { printf("str5 and str6 have the same content\n"); } else { printf("str5 and str6 have different content\n"); } return 0; }
内容的提问来源于stack exchange,提问作者Hayato Koyama
相关产品推荐
相关产品推荐

