Эти операторы об указателях имеют тот же эффект?

Делает это...

char* myString = "hello";

... иметь тот же эффект как это?

char actualString[] = "hello";
char* myString = actualString;
20
задан Pieter 19 January 2010 в 19:33
поделиться

4 ответа

Нет.

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

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

str1[1] = 'u'; //Valid
str2[1] = 'u'; //Invalid - MAY crash program!
33
ответ дан 29 November 2019 в 23:41
поделиться

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

-121--2136603-

No.

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

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

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

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

4
ответ дан 29 November 2019 в 23:41
поделиться

нет. В первом, вы не можете изменить строку, указанную на MyString , во втором вы можете. Читать далее здесь .

3
ответ дан 29 November 2019 в 23:41
поделиться

Это не то же самое, потому что неназванная массив, указанный на MyString 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 могут быть либо равными, либо неравными - оба действительны.

3
ответ дан 29 November 2019 в 23:41
поделиться
Другие вопросы по тегам:

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