Имеют ли эти утверждения о указателях одинаковый эффект? - программирование
Подтвердить что ты не робот

Имеют ли эти утверждения о указателях одинаковый эффект?

Это...

char* myString = "hello";

... имеют тот же эффект, что и этот?

char actualString[] = "hello";
char* myString = actualString;
4b9b3361

Ответ 1

Нет.

char  str1[] = "Hello world!"; //char-array on the stack; string can be changed
char* str2   = "Hello world!"; //char-array in the data-segment; it READ-ONLY

Первый пример создает массив размера 13*sizeof(char) в стеке и копирует в него строку "Hello world!".
Второй пример создает char* в стеке и указывает его на местоположение в сегменте данных исполняемого файла, который содержит строку "Hello world!". Эта вторая строка READ-ONLY.

str1[1] = 'u'; //Valid
str2[1] = 'u'; //Invalid - MAY crash program!

Ответ 2

Нет. Первый дает вам указатель на данные const, и если вы меняете любой символ с помощью этого указателя, это поведение undefined. Вторая копирует символы в массив, который не является const, поэтому вы можете изменять любые символы (либо непосредственно в массиве, либо через указатель) без каких-либо вредных эффектов.

Ответ 3

Нет. В первом случае вы не можете изменить строку, указанную myString, во второй, которую вы можете. Подробнее здесь.

Ответ 4

Это не то же самое, потому что неназванный массив, на который указывает myString в первом примере, доступен только для чтения и имеет статическую продолжительность хранения, тогда как именованный массив во втором примере записывается и имеет автоматическую продолжительность хранения.

С другой стороны, это ближе к эквиваленту:

static const char actualString[] = "hello";
char* myString = (char *)actualString;

Это все еще не совсем то же самое, потому что неназванные массивы, созданные строковыми литералами, не гарантируются как уникальные, тогда как явные массивы. Итак, в следующем примере:

static const char string_a[] = "hello";
static const char string_b[] = "hello";
const char *ptr_a = string_a;
const char *ptr_b = string_b;
const char *ptr_c = "hello";
const char *ptr_d = "hello";

ptr_a и ptr_b гарантированно сравниваются неравномерно, тогда как ptr_c и ptr_d могут быть либо равными, либо неравными - оба действительны.