虽然指针是C语言中相对复杂的语法,但它们确实很容易使用。 因此,我写了很多讨论C语言指针的文章。 相信对于初学者理解指针会有帮助。

事实上,确实有读者私信我说,看完这些文章后,“我终于不再害怕指针了”。 但他也提出了一个问题:C语言有“不透明指针()”吗? 如果是的话,什么样的指针是不透明指针,有什么用呢?

指针c语言用法_c语言指针_指针c语言是什么意思

C语言中“不透明指针”有什么用?

C语言中的“不透明指针”

说实话,我很讨厌对初学者说一些非常“专业”的术语。 这不利于理解概念的本质,而且很容易让一些初学者产生恐惧感。 “不透明指针”就是其中之一。 事实上,这并不是一个困难的概念,甚至不是一个新概念。 只是一些基础知识的用法,但是它的名字却很做作。

从字面上看,“不透明”意味着看不到内部,所以“不透明指针”就是看不到内部定义的指针。 这有点抽象,我们看一个例子:

typedef struct pmpi_s *pmpi; 

上面这行C语言代码使用关键字定义了一个结构体指针类型pmpi,该结构体由 指定。 虽然没有具体定义结构体,但是已经可以使用 pmpi 来定义变量,例如下面这行 C 语言代码:

pmpi p = NULL;

这里的指针p是一个“不透明指针”,因为我们暂时看不到它指向什么,就像一个“不透明”的盒子一样。

指针c语言用法_指针c语言是什么意思_c语言指针

就像一个“不透明”的盒子

至此,相信读者已经了解了什么是C语言中的“不透明指针”,也可以看出,所谓“不透明指针”其实并不是什么新概念,只是为了描述方便而已。一种特定类型的指针,方便对等体之间交换的只是一个名称。

C语言中“不透明指针”有什么用?

一般来说,稍大一点的C语言项目不是一个人开发的。 在多人协作开发中,难免要调用别人写的库函数,或者提供自己写的库函数供别人使用。

即使是初学者也应该明白,要调用C语言函数,首先需要知道它的原型,所以通常,库一般会提供一个头文件,其中包含库中实现的函数原型或数据结构定义。 比如我们常用的是标准io库的头文件,其中包含了标准库函数的原型(例如)。

但是,有时我不想向外部调用者公开我编写的库的所有详细信息。 例如,在源代码中,有这样一个定义,相关的C语言代码如下,请参见:

// fun.c 文件
...
struct pmpi_s {
 uint16_t *data;
 size_t sz;
 size_t used;
 int sign;
};
void handle_s(struct pmpi_s *p){
 ...
}
...

指针c语言是什么意思_指针c语言用法_c语言指针

相关C语言代码

我只想使用自己的源文件(.c 文件)中的结构,而不希望外部调用者知道其结构,以便他们可以轻松修改相关数据。 一般情况下,只要这个定义不写在公开的头文件中就可以了。 但是,如果()也是需要暴露的库函数之一,那么我就必须提供pmpi结构的定义,这样看来我不能两者兼得?

当然不是,这时候C语言的“不透明指针”就派上用场了,将结构体pmpi的不透明指针放在头文件中:

// fun.h 文件
typedef struct pmpi_s *pmpi;
void handle_s(pmpi p);

C语言中的“不透明指针”

这样,如果我的同事需要调用我写的库函数,他只需要包含“fun.h”,他就可以使用()函数,但是他不知道具体的结构,因为这就是我想要的隐藏内容。

概括

C语言的语法其实非常简洁。 一些看似复杂的概念(例如“不透明指针”)实际上只是基本概念的引用。 透明指针可以隐藏库的一些细节,一是为了安全,二是为了以后的扩展。 ——无论我如何修改我的库中的结构,都不会影响外部调用者。

事实上,就本文的例子而言,我们可以使用“通用指针(void *指针)”来隐藏相关细节。 这在我之前的文章中已经讨论过,所以不再赘述。

指针c语言是什么意思_c语言指针_指针c语言用法

好了,今天的主题就讲到这里吧,不管如何,能帮到你我就很开心了,如果您觉得这篇文章写得不错,欢迎点赞和分享给身边的朋友。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注