Что такое непрозрачный указатель в C? - PullRequest
53 голосов
/ 26 сентября 2011

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

Ответы [ 2 ]

92 голосов
/ 26 сентября 2011

Непрозрачный указатель - это указатель, в котором не раскрываются подробности базовых данных (из словарного определения: непрозрачный: прилагательное; невозможно увидеть сквозь; не прозрачный ).

Например, вы можете объявить в заголовочном файле (это из моего реального кода):

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).
};

и легкий доступ к отдельным его полям, что не может сделать пользователь заголовочного файла.

Дополнительную информацию можно найти на странице Википедии для непрозрачных указателей.

Основное назначение - скрыть детали реализации от пользователей вашей библиотеки. Инкапсуляция (несмотря на то, что вам скажет C ++) существует уже давно: -)

Вы хотите опубликовать достаточно информации о своей библиотеке, чтобы пользователи могли эффективно использовать ее, и не более. Публикация большего количества данных дает пользователям сведения, на которые они могут полагаться (например, тот факт, что Переменная размера sz находится в определенном месте в структуре, что может привести к тому, что они будут обходить ваши элементы управления и манипулировать им напрямую.

Тогда вы обнаружите, что ваши клиенты горько жалуются, когда вы меняете внутренние устройства. Без этой информации о структуре ваш API ограничивается только тем, что вы предоставляете, и ваша свобода действий в отношении внутренних компонентов сохраняется.

0 голосов
/ 27 апреля 2019

Непрозрачный, как следует из названия, это то, что мы не видим сквозь. например дерево непрозрачное. Непрозрачный указатель - это указатель, который указывает на структуру данных, содержимое которой не раскрывается во время ее определения. Пример:

struct STest * pSTest;

Можно присвоить NULL непрозрачному указателю.

pSTest = NULL;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...