"Розпад" відноситься до неявного перетворення виразу з типу масиву в тип вказівника. У більшості контекстів, коли компілятор бачить вираз масиву, він перетворює тип виразу з "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
є покажчиком функції. Корисно, якщо ви хочете передати його шаблону, що приймає посилання.