[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Чёртов язык Си!



On Tue, 7 Oct 2014, Dmitrii Kashin wrote:

yuri.nefedov@gmail.com writes:

 Тогда похоже, что между указателями на incomplete type и void*
 вообще нет никакой разницы. Тем более что и преобразования
 типа void* <-> struct* будут выполнятся молча, даже без
 предупреждений. Просто это «сахар» для писателя/читателя программы.
 Можно было бы и typedef обойтись.

Нет. Поскольку там не void*, а struct S*, Вы гарантированно подсунете в
функцию struct S*, а не что-то ещё. А то вдруг у Вас ещё одна библиотека
работает по такому же принципу. Тогда у Вас будет struct N* ещё
какой-нибудь. И если Вы его ненароком подсунете в функцию, которая
принимает struct S*, то получите ошибку на этапе компиляции.


 А вы попробуйте. Вот рабочий пример:
------------------------------------------
struct s{
 int test;
};

void check()
{
int a = 1;
struct s c = {3};

int* ptr_int = &a;
struct s* ptr_struct = &c;
void* ptr_void = NULL;

printf(" struct ptr= %p, void* %p\n",ptr_struct,ptr_void);

ptr_void = ptr_int;
ptr_void = ptr_struct;

ptr_int = ptr_void;
ptr_struct = ptr_void;

printf(" struct ptr= %p, void* %p\n",ptr_struct,ptr_void);
}
------------------------------------------

 преобразования struct S* -> void*
 и void* -> struct S* выполняются без лишних слов.
 Поэтому void* и называют универсальным указателем.
Ю.

Reply to: