Когда вы делаете ==
с указателями (это то, что str1
и str2
в обоих случаях 1 ), все, что вы делаете, сравнивает два адреса, чтобы увидеть, совпадают ли они,Когда вы делаете
char str1[]="hello";
char str2[]="hello";
Вы создаете в стеке два массива, которые содержат "hello"
.Они, безусловно, находятся в разных местах памяти, поэтому str1 == str2
равно false
.Это похоже на
char str1[6];
str1[0] = 'h';
str1[1] = 'e';
str1[2] = 'l';
str1[3] = 'l';
str1[4] = 'o';
str1[5] = '\0';
// and the same thing for str2
Когда вы делаете
char *str1="hello";
char *str2="hello";
Вы создаете два указателя на глобальные данные "hello"
.Компилятор, видя, что эти строковые литералы одинаковы и не могут быть изменены, заставит указатели указывать на один и тот же адрес в памяти, а str1 == str2
равен true
.
Для сравнения содержимого из двух char*
s, используйте strcmp
:
// strcmp returns 0 if the two strings are equal
if (strcmp(str1, str2) == 0)
printf("Equal");
else
printf("Not equal");
Это примерно эквивалентно
char *a, *b;
// go through both strings, stopping when we reach a NULL in either string or
// if the corresponding characters in the strings don't match up
for (a = str1, b = str2; *a != '\0' && *b != '\0'; ++a, ++b)
if (*a != *b)
break;
// print Equal if both *a and *b are the NULL terminator in
// both strings (i.e. we advanced a and b to the end of both
// strings with the loop)
if (*a == '\0' && *b == '\0')
printf("Equal");
else
printf("Not equal");
1 В версии char*
это действительно так.В версии char[]
str1
и str2
действительно массивы , а не указатели, однако при использовании в str1 == str2
они распадаются на указатели на первые элементы массивов, поэтому ониэквивалент указателей в этом сценарии.