void describe(void *thing);
void *move(void *location, Direction direction);
Перша функція нічого не повертає. Друга функція повертає недійсний покажчик. Я би оголосив цю другу функцію як
void* move(void* location, Direction direction);
Якщо може допомогти, якщо ви вважаєте, що "недійсне" означає "без сенсу". Повернене значення describe
"без сенсу". Повернення значення з такої функції є незаконним, оскільки ви сказали компілятору, що повернене значення не має сенсу. Ви не можете зафіксувати повернене значення з цієї функції, оскільки це без сенсу. Ви не можете оголосити змінну типу, void
оскільки вона не має сенсу. Наприклад, void nonsense;
це нісенітниця і насправді є незаконною. Також зауважте, що масив недійснихvoid void_array[42];
також є нісенітницею.
Вказівник на void ( void*
) - це щось інше. Це вказівник, а не масив. Прочитайтеvoid*
як означає вказівник, який вказує на щось "без сенсу". Вказівник "не має сенсу", а це означає, що не має сенсу знецінювати такий покажчик. Намагання зробити це насправді незаконно. Код, що відмежування, недійсний покажчик не буде скомпільований.
Отже, якщо ви не можете розмежувати покажчик недійсності і не можете створити масив порожнеч, як ви можете їх використовувати? Відповідь полягає в тому, що вказівник на будь-який тип може бути переданий на та з нього void*
. Закидання деякого вказівника на void*
та повернення до вказівника до оригінального типу дасть значення, рівне вихідному покажчику. Стандарт С гарантує таку поведінку. Основна причина, по якій ви бачите так багато недійсних покажчиків на C, полягає в тому, що ця можливість забезпечує спосіб реалізації приховування інформації та програмування на основі об'єктів на тому, що дуже не є об'єктно орієнтованою мовою.
Нарешті, причина, яку ви часто бачите move
як оголошену, void *move(...)
а не те void* move(...)
, що ставити зірочку поруч із іменем, а не типом, є досить поширеною практикою у C. Причиною є те, що наступна декларація спричинить вам великі проблеми: int* iptr, jptr;
Це призведе до вас думаю, ти оголошуєш два покажчики на "an" int
. Ти не. Ця заява робить , а не покажчик на . Правильна заява: Ви можете зробити вигляд, що зірочка належить до типу, якщо ви дотримуєтесь практики оголошення лише однієї змінної на кожне твердження. Але майте на увазі, що ви робите вигляд.jptr
int
int
int *iptr, *jptr;
void
коли використовується приклад коду,void*
який є зовсім іншим.