Подтвердить что ты не робот

Что такое непрозрачный указатель на C?

Могу ли я узнать об использовании и логике концепции непрозрачного указателя в C?

4b9b3361

Ответ 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;