char *str1 = "hello";
char str2[] = "hello";
if (str1 == "hello")
printf("ok1\n");
if (str2 == "hello")
printf("ok2\n");
if (strcmp(str1, "hello"))
printf("ok3\n");
if (strcmp(str2, "hello"))
printf("ok4\n");
一道基础题,知道 ==比较地址,strcmp比较内容。
请各位大神指教为何输出的是 ok1 谢谢!
"hello"是字符串常量,编译器会进行优化:
由于所有的"hello"都是相同的,整个程序中只需要有一个"hello"字符串。然后所有引用"hello"这个字符串的**指针变量**都赋值成相同的地址。
所以:
char *str1 = "hello";
和"hello"
的地址是相同的。
对于:char str2[] = "hello";
,这里str2
并不是指针,类型里已经说明它是一个数组,所以这会是另一个内存地址,于是str2
与"hello"
的地址是不同的。
strcmp
的部分你应该清楚,我就不解释了。
char *str1 = "hello";
等价为
const char *str1 = "hello";
所以
if (str1 == "hello")
printf("ok1\n");
是正常的
#include"stdio.h"
#include"string.h"
main()
{
char *str1 = "hello";
char str2[] = "hello";
printf("%d\n",str1 == "hello");
printf("%d\n",str2 == "hello");
printf("%d\n",strcmp(str1,"hello"));
printf("%d\n",strcmp(str2,"hello"))
输出结果1 0 0 0 。说明
1. str2 == "hello"是不成立的。字符串的比较不能用==
2. strcmp(str1,"hello"),strcmp(str2,"hello")都是成立的,因为成立的时候strcmp里边两个参数相等的时候值为0
char *str1 = "hello";
"hello"是储存在静态常量区的,你在对str1赋值的时候,系统默认将str1指向"hello",导致string和"hello"地址相同。
这是编译器优化的结果。
定义 char *str1 = "hello"; 时 str1 是指向常量字符串 "hello" 的。"hello" 存贮于常量区!
再在代码中出现 "hello" 时,会使用常量区已经有的、不会再重新定义。
任何试图修改 str1 所指的字符串的代码,将产生异常错误。
常量直接比地址就行了吧
谢谢大家的回答 :str1
中的hello
在常量存储区,
str2并不是指针,类型里已经说明它是一个数组,所以这会是另一个内存地址
str2是作为局部变量存在栈中吗?
if (str1 == "hello") 因为==是比较地址. 而str1与"hello"都是同一地址, 的以会相等.
注: "hello"是常量区中的一个串, str1又是指向这个串的. (str1 == "hello") 比较的就是str1指向的地址, 与"hello"串所在的地址. 两个地址当然是相同的了
"hello"是字符串常量,编译器会进行优化:
由于所有的"hello"都是相同的,整个程序中只需要有一个"hello"字符串。然后所有引用"hello"这个字符串的**指针变量**都赋值成相同的地址。
所以:
char *str1 = "hello";和"hello"的地址是相同的。
对于:char str2[] = "hello";,这里str2并不是指针,类型里已经说明它是一个数组,所以这会是另一个内存地址,于是str2与"hello"的地址是不同的。
strcmp的部分你应该清楚,我就不解释了。