许多编程语言都宣传“无指针”作为其优势。 然而,对于C语言来说,指针是与生俱来的。

那么,什么是指针,以及为什么每个人都想避免它们。

这很简单。 指针是一个地址。 当地址作为变量存在时,它被称为指针。 变量的类型自然就是指针类型。

指针的作用是给出一个指针并检索该指针所指向的地址处的值。 为了理解本质,我们从计算机模型开始。

从宏观上看,计算机可以分为两类:

存储执行计算机。

这类机器的典型例子就是我们平时使用的计算机。 它有一个CPU和一个内存。 CPU仅包含计算逻辑。 所有指令和数据都在内存中。 内存仅用于存储,不包含任何计算组件。

现场编程计算机。

此类机器的典型示例是 ASCI 电路和 FPGA。 逻辑电路是根据特定需求直接构建的。 然而,由于笛卡尔积问题,它们不适合通用计算。

我们看一下我们平时使用的存储-执行模型的计算机工作模式:

CPU通过地址总线将地址传输到存储器。

存储器将对应于特定地址的数据返回至数据总线。

似乎通用计算机通过指针完成所有工作。 CPU没有能力直接操作内存中的值。 它必须以迂回的方式执行以下操作:

从特定地址A0获取值V0。

对V0进行处理,生成V1。

将V1存入特定地址A1。

最初,人们是按照上述逻辑进行编程的。 这是汇编语言:

mov -0x4c(%rbp),%ebx

不过,这样也太麻烦了。 C语言是与简单通用的UNIX操作系统一起诞生的。 下面的说法似乎更方便:

整数a = 10;

字符 *p = &a;

*p = 13;

C语言直接映射CPU的工作模式,而且方式极其简单。 这就是C语言的艺术。

这就是C指针出现的背景。 当时,人们并不渴望计算机帮助完成更复杂的业务逻辑。 人们只是希望以更简单的方式抽象计算机的行为。 最终的结果就是C语言。

因此,我们说C语言的本质是指针,指针就是C语言的一切。 我们不需要if-else语言,我们不需要-case语句,我们不需要while,我们不需要for,但是我们必须有指针。

是的,我们可以使用指针函数的状态矩阵来代替 if-else 之类的:

int (*)[…]();

= 计算(…);

[](argv);

我们使用状态矩阵成功地避免了 if-else…如您所见,我们仍然使用指针。

……

指针对于存储执行模型的计算机工作是必需的!

我们来看看存储和执行模型的计算机是如何工作的:

给定一个地址,CPU 可以检索该地址处的数据。

给定一个地址,CPU 可以向该地址写入一个值。

这意味着什么?

只要想让CPU正常工作,就必须将整个内存地址空间暴露给CPU,否则CPU只是一堆无用的门电路。 换句话说,一切都来自记忆! 操作内存就必须使用指针!

事实上,C语言是汇编语言的简化版本。 最终,C 语言中继了汇编,创造了指针的世界。

无论如何,C语言是面向计算机的编程语言,而不是面向商业的编程语言。 它映射了计算机的工作方式,但不太擅长描述业务逻辑。 因此,C语言很受黑客和编程工匠的欢迎。 它受到爱好者的喜爱,却被商业程序员所厌恶,因为玩指针实在是太繁琐复杂,一不小心就会出错。

存储-执行模型的问题在于,需要设计复杂的带外机制来防止对内存的任意访问,从而导致复杂的分段、分页、访问控制、MMU等机制。 当然,这些机制和CPU都依赖于指针访问。 记忆的工作方式不存在冲突。

C语言指针最完美的运用大概就是Linux内核的内嵌链表了:

{

*下一个,*上一个;

};

它可以代表一切,它通过C指针完美地解释了OOD,是世界的基类!

宏可用于转换为任意对象:

/**

* – 将 a 的 a 投射到

* @ptr:从到。

* @type: this 所在的类型。

* @: 的名称。

*/

# (ptr, 类型, ) ({

无效* = (无效*)(ptr);

(!(*(ptr), ((类型 *)0)->) &&

!(*(ptr), void),

“ 输入 ()”);

((类型 *)( – (类型, ))); })

此转换背后的依赖正是指针:

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

但是,C语言对于商业编程仍然不太友好。 如前所述,C 语言映射了计算机的工作方式。 想要用好C语言,就必须了解计算机原理。 这不适合商业程序员。 业务程序工程师只需要编写业务逻辑,并不关心计算机如何工作。

曾几何时,计算机仍然是一群痴迷于技术本身的极客的玩具。 电脑属于他们。 他们用 C 语言编程,并使用 Perl//Bash 将二进制程序粘合在一起。 互联网时代,随着越来越复杂的业务逻辑的出现,越来越多的专业程序员开始成为多数,他们开始使用更加适合业务的语言。 Java 和 Go 取得了成功。

不能说这些业务编程语言没有指针,只是它们隐藏了指针,它们让程序员接触到了更加业务友好的编程接口和语法,它们在底层处理了指针问题,仅此而已。 指针是客观存在的,只要你使用的是存储执行模型的计算机,指针就是一切。

需要C/C++ Linux服务器架构师学习资料私信《资料》(资料包括C/C++、Linux、技术、Nginx、MySQL、Redis、、ZK、流媒体、CDN、P2P、K8S、TCP/IP、协程、DPDK等),免费分享

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

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

发表回复

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