void logC(const char* message);
Принимает указатель на буфер char
. Это также известно как C -строка (до тех пор, пока она завершается нулем, то есть ваша, потому что это строковый литерал).
void logCA(const char message[]);
Точно так же . Не позволяйте []
обмануть вас: это буквально то же самое, что и const char* message
. Это не потому, что массивы являются указателями: это не так. Это странная странность из C истории. Параметр функции с тем, что выглядит как «тип массива» без измерений, вместо этого обрабатывается как параметр указателя. Фу!
void logS(string message);
Принимает std::string
. Они могут быть построены из C -строк, и это происходит за кулисами, когда вы передаете строковый литерал.
Что лучше? Это очень субъективно. Возможно, вы хотите const std::string_view
, который может принять любой из них бесплатно. Но глубокое обсуждение различий здесь выходит за рамки; однако его можно найти в вашей книге.
он получает адрес для местоположения символа, почему выводом является весь массив, а не адрес памяти, на котором он
Потому что cout
имеет специальное правило для char*
, зная, что вы обычно хотите, чтобы с ними обращались как со строками, потому что вы это делаете. Вместо того, чтобы печатать значение указателя (адрес памяти), он разыменовывает это и печатает все символы в буфере, на который он указывает, заканчиваясь нулевым ограничителем. Это функция.
Если вы используете приведение к другому типу указателя, вы можете «отключить это», например, cout << (void*)message
, теперь вы увидите адрес.