В чем причина инициализации или присвоения пустого строкового литерала указателю на char в C или указателю на const char в C ++?
Мне кажется, что здесь есть недоразумение. Указатель не инициализирован пустой строкой. Он инициализируется , указывающим на пустую строку (строковый литерал, который компилятор поместил где-то в памяти). Это существенное различие.
Рассмотрим этот код:
char* p = "";
printf("%p\n", (void*)p);
p = "test";
printf("%p\n", (void*)p);
Возможный вывод:
0x563e72497007
0x563e72497008
В этих случаях p
содержит адрес памяти, на котором размещен компилятор два строковых литерала (то есть "" в 0x563e72497007 и "test" в 0x563e72497008). Итак, в этой памяти у вас есть:
0x563e72497007 '\0' (i.e. the empty string that only consists
a string termination character`)
0x563e72497008 't' 'e' 's' 't' '\0' (i.e. the string "test")
Итак, еще раз - p
не инициализируется / не присваивается со строками, он инициализируется / присваивается указывать на строки .
Почему вы хотите инициализировать указатель для указания на пустую строку?
Ну, это как любая другая переменная, которую вы инициализируете ... Вы делаете это, потому что хотите, чтобы переменная имела известное значение в случае, если он используется до того, как ему будет присвоено какое-либо другое назначение. Так же как и int i = 0;
.
Другими словами - вы делаете char* p = "";
, чтобы убедиться, что p
указывает на допустимую строку C -тиля.
Очень просто Пример:
char* p = "";
if (answerIsWrong())
{
p = "not";
}
printf("The answer is %s correct\n", p);
В зависимости от возвращаемого значения из функции answerIsWrong()
это может вывести:
The answer is correct
или
The answer is not correct
В первом случае это Важно, что p
был инициализирован до , указывает на пустую строку.
Однако, если вы знаете , вы никогда не будете использовать p
до того, как ему будет назначен новое значение, очевидно, нет причин для его инициализации! Тем не менее, некоторые программисты предпочитают всегда инициализировать все переменные - даже если они назначают другое значение перед использованием.
Пример:
char* p = ""; // No reason for this initialization
// p will be assigned another value before it's used
if (answerIsWrong())
{
p = " not ";
}
else
{
p = " absolutely ";
}
printf("The answer is %s correct\n", p);