«Распад» относится к неявному преобразованию выражения из типа массива в тип указателя. В большинстве случаев, когда компилятор видит выражение массива, он преобразует тип выражения из «массива 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на функцию. Полезно, если вы хотите передать его шаблону, принимающему ссылку.