"Розпад" відноситься до неявного перетворення виразу з типу масиву в тип вказівника. У більшості контекстів, коли компілятор бачить вираз масиву, він перетворює тип виразу з "N-елементного масиву T" в "покажчик на T" і встановлює значення виразу на адресу першого елемента масиву . Винятки з цього правила - це коли масив є операндом sizeofабо &операторів, або масив - це рядковий літерал, який використовується як ініціалізатор у декларації.
Припустимо наступний код:
char a[80];
strcpy(a, "This is a test");
Вираз aмає тип "80-елементний масив char", а вираз "Це тест" має тип "16-елементний масив char" (в C; у C ++ рядкові літерали - це масиви const char). Однак у виклику до strcpy()жоден вираз не є операндом sizeofабо &, тому їх типи неявно перетворюються на "покажчик на char", а їх значення встановлюються на адресу першого елемента в кожному. Що 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. Однак вони бувають різних типів і трактуються по-різному, як показано нижче:
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 є простим покажчиком на char.
int a[10]; int b(void);, тоді+aце int pointer та+bє покажчиком функції. Корисно, якщо ви хочете передати його шаблону, що приймає посилання.