mrjbom
@mrjbom

В чём отличие между char* и char[]?

Привет.
Раньше думал что это одно и тоже, но решил проверить, есть такой код:

#include <iostream>

int main()
{
  char* str1 = "str";
  char* str2 = "str";
  
  if(str1 == str2)
  {
      std::cout << "true";
  }
  else
  {
      std::cout << "false";
  }
}


Если в коде будет
char* str1 = "str";
char* str2 = "str";


Напишет true, почему?

А если
char str1[] = "str";
char str2[] = "str";


Пишет false, почему?

В чём разница?
  • Вопрос задан
  • 3762 просмотра
Решения вопроса 2
32bit_me
@32bit_me
Программист, встраиваемые системы
Разница в том, что в первом случае компилятор видит, что строковые литералы одинаковы, и генерирует только одну строку, и присваивает str1 и str2 указатели на неё. Во втором случае он не может так сделать, потому что массивы не константны, и в дальнейшем могут изменяться независимо. Поэтому указатели разные.
Однако в общем случае поведение такого кода полностью зависит от реализации компилятора и от опций, поэтому лучше так не делать вообще. Clang пишет: array comparsion always evaluates to false.
Ответ написан
@lorc
В случае выделения на стеке или в глобальных переменных - разница очень большая. char* - это просто указатель. Как тут правильно сказали - у вас будет два указателя на один и тот же строковый литерал.

char[] - создание массива на стеке. Соответственно, у вас там будут хранится не два указателя, а два массива. Вы сравниваете их и они очевидно не равны.

Вот пример: https://ideone.com/pIhUvq. Как видите, в одном случае у нас 64-битный указатель, а в другом - массив.

А вот в параметрах функции - действительно, большой разницы нет.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы