«Распад» относится к неявному преобразованию выражения из типа массива в тип указателя. В большинстве случаев, когда компилятор видит выражение массива, он преобразует тип выражения из «массива 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
простой указатель на символ
int a[10]; int b(void);
, то+a
это указатель на int и указатель+b
на функцию. Полезно, если вы хотите передать его шаблону, принимающему ссылку.