«Распад» относится к неявному преобразованию выражения из типа массива в тип указателя. В большинстве случаев, когда компилятор видит выражение массива, он преобразует тип выражения из «массива N-элемента T» в «указатель на T» и устанавливает значение выражения в адрес первого элемента массива. , Исключением из этого правила является случай, когда массив является операндом операторов sizeof
или &
, или массив является строковым литералом, используемым в качестве инициализатора в объявлении.
Примите следующий код:
char a[80];
strcpy(a, "This is a test");
Выражение a
относится к типу "массив из 80 элементов char", а выражение "Это тест" относится к типу "массив из 16 элементов char" (в C; в C ++ строковые литералы являются массивами const char). Однако в вызове strcpy()
ни одно из выражений не является операндом sizeof
или &
, поэтому их типы неявно преобразуются в «указатель на символ», а их значения устанавливаются в адрес первого элемента в каждый. strcpy()
получает не массивы, а указатели, как видно из его прототипа:
char *strcpy(char *dest, const char *src);
Это не то же самое, что указатель массива. Например:
char a[80];
char *ptr_to_first_element = a;
char (*ptr_to_array)[80] = &a;
И ptr_to_first_element
, и ptr_to_array
имеют одинаковое значение ; Базовый адрес. Однако они относятся к разным типам и обрабатываются по-разному, как показано ниже:
a[i] == ptr_to_first_element[i] == (*ptr_to_array)[i] != *ptr_to_array[i] != ptr_to_array[i]
Помните, что выражение a[i]
интерпретируется как *(a+i)
(которое работает только в том случае, если тип массива преобразуется в тип указателя), поэтому и a[i]
, и ptr_to_first_element[i]
работают одинаково. Выражение (*ptr_to_array)[i]
интерпретируется как *(*a+i)
. Выражения *ptr_to_array[i]
и ptr_to_array[i]
могут приводить к предупреждениям или ошибкам компилятора в зависимости от контекста; они определенно поступят неправильно, если вы ожидаете, что они оценят до a[i]
.
sizeof a == sizeof *ptr_to_array == 80
Опять же, когда массив является операндом sizeof
, он не преобразуется в тип указателя.
sizeof *ptr_to_first_element == sizeof (char) == 1
sizeof ptr_to_first_element == sizeof (char *) == whatever the pointer size
is on your platform
ptr_to_first_element
- простой указатель на символ.