Другие ответы объясняли, почему вы не можете ожидать, что адреса указателей будут другими.Тем не менее, вы можете легко переписать это так, чтобы гарантировать, что A
и B
не будут сравниваться одинаково:
static const char A[] = "same";
static const char B[] = "same";// but different
void f() {
if (A == B) {
throw "Hello, string merging!";
}
}
Разница в том, что A
и B
теперь являются массивами символов,Это означает, что они не являются указателями, и их адреса должны отличаться, как и адреса двух целочисленных переменных.C ++ смущает это, потому что заставляет указатели и массивы казаться взаимозаменяемыми (operator*
и operator[]
ведут себя одинаково), но они действительно разные.Например, что-то вроде const char *A = "foo"; A++;
совершенно законно, а const char A[] = "bar"; A++;
- нет.
Один из способов понять разницу состоит в том, что char A[] = "..."
говорит: «Дайте мне блок памяти и заполните его символами»....
с последующим \0
", тогда как char *A= "..."
говорит:« дай мне адрес, по которому я могу найти символы ...
, за которыми следует \0
».