Могу ли я узнать об использовании и логике концепции непрозрачного указателя в C?
Что такое непрозрачный указатель на C?
Ответ 1
Непрозрачный указатель - это тот, в котором не отображаются детали базовых данных (из определения словаря: непрозрачное: прилагательное, не может быть просмотрено, непрозрачно).
Например, вы можете объявить в заголовочном файле (это из некоторого моего фактического кода):
typedef struct pmpi_s *pmpi;
который объявляет тип pmpi
, который является указателем на непрозрачную структуру struct pmpi_s
, поэтому все, что вы объявляете как pmpi
, будет непрозрачным указателем.
Пользователи этой декларации могут свободно писать код, например:
pmpi xyzzy = NULL;
не зная фактического "определения" структуры.
Затем в коде, который знает об определении (т.е. коде, обеспечивающем функциональность для обработки pmpi
, вы можете "определить" структуру:
struct pmpi_s {
uint16_t *data; // a pointer to the actual data array of uint16_t.
size_t sz; // the allocated size of data.
size_t used; // number of segments of data in use.
int sign; // the sign of the number (-1, 0, 1).
};
и легко получить доступ к отдельным полям, которые не могут выполнять пользователи файла заголовка.
Более подробную информацию можно найти на странице Wikipedia для непрозрачных указателей.
Основное его использование - скрыть детали реализации от пользователей вашей библиотеки. Инкапсуляция (несмотря на то, что толпа С++ вам расскажет) существует уже давно: -)
Вы хотите опубликовать достаточно информации о своей библиотеке, чтобы пользователи могли ее эффективно использовать, и не более того. Публикация больше дает пользователям информацию, на которую они могут положиться (например, переменная размера sz
находится в определенном месте в структуре, что может привести к обходу ваших элементов управления и управлению им напрямую.
Затем вы будете жаловаться горько, когда вы меняете внутренности. Без этой информации о структуре ваш API ограничен только тем, что вы предоставляете, и ваша свобода действий в отношении внутренних компонентов поддерживается.
Ответ 2
Непрозрачный, как следует из названия, это то, через что мы не можем видеть. например, древесина непрозрачна. Непрозрачный указатель - это указатель, который указывает на структуру данных, содержимое которой не раскрывается во время ее определения. пример:
struct STest * pSTest;
Безопасно назначать NULL непрозрачному указателю.
pSTest = NULL;