Делает это...
char* myString = "hello";
... иметь тот же эффект как это?
char actualString[] = "hello";
char* myString = actualString;
Нет.
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!
No. В первом случае нельзя изменить последовательность, указанный myString
, во втором можно изменить. Подробнее здесь .
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
, поэтому можно изменять любые символы (либо непосредственно в массиве, либо с помощью указателя) по желанию без нежелательных эффектов.
нет. В первом, вы не можете изменить строку, указанную на MyString
, во втором вы можете. Читать далее здесь .
Это не то же самое, потому что неназванная массив, указанный на 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
могут быть либо равными, либо неравными - оба действительны.