```c // 要想得到 10,你需要先解引用 ptr_to_ptr_attempt,得到的是 ptr_to_int (它存储了 var 的地址) // 然后再解引用得到的值,这就相当于解引用了 ptr_to_int,从而得到 var 的值 10。 int actual_value = (int )ptr_to_ptr_attempt; // 这里编译器会报错,因为 ptr_to_ptr_attempt 是 int 类型,不能直接 ```
看到了吧?编译器会在这里报错。为什么?因为你告诉编译器 `ptr_to_ptr_attempt` 是一个 `int `。 当你尝试对它进行 `` 操作时,第二次解引用 `(ptr_to_ptr_attempt)` 是不合法的。编译器不知道 `ptr_to_ptr_attempt` ( которое на самом деле является адресом `var`)应该被看作什么类型来进一步解引用。它只知道 `ptr_to_ptr_attempt` 应该被看作一个 `int`。
正确的方式是使用 `int `:
```c int var = 10; int ptr_to_int = &var // 正确声明一个指向 int 的指针 int ptr_to_ptr_to_int = &ptr_to_int;
// 现在,编译器知道 ptr_to_ptr_to_int 是 int 类型。 // 第一次解引用 ptr_to_ptr_to_int 会得到一个 int (也就是 ptr_to_int) // 第二次解引用 (ptr_to_ptr_to_int) 就会按照 int 的规则去访问,得到一个 int (也就是 var 的值 10) int final_value = ptr_to_ptr_to_int;
好的,我们来深入探讨一下 C 语言中为什么需要 `int `(指向指针的指针)而不是直接用 `int ` 来表示,以及这里的类型系统是如何工作的。首先,我们得明白什么是“类型”在 C 语言中的作用。在 C 语言中,类型不仅仅是一个标签,它承载着至关重要的信息,指导着编译器如何理解和操作内存中的数据:.............
在 C 语言中,不同类型指针的大小不一定完全相同,但绝大多数情况下是相同的。这是一个非常值得深入探讨的问题,背后涉及到计算机的底层原理和 C 语言的设计哲学。要理解这一点,我们需要先明确几个概念:1. 指针的本质: 无论指针指向的是 `int`、`char`、`float` 还是一个结构体,它本质.............
C 语言中,一些自带函数返回的是指向数组的指针,而你无需手动释放这些内存。这背后涉及到 C 语言的内存管理机制以及函数设计哲学。要弄清楚这个问题,我们需要从几个关键点入手: 1. 返回指针的函数,内存的归属至关重要首先,理解函数返回指针时,内存的“所有权”是谁的,是解决这个疑问的核心。当一个函数返回.............
为什么说指针是 C 语言的精髓?指针是 C 语言的灵魂,是其强大的根基,更是学习和掌握 C 语言的关键所在。将指针比作 C 语言的精髓,绝非夸大其词,其原因体现在以下几个方面,我们将逐一深入探讨: 1. 直接操作内存的钥匙C 语言之所以强大,在于它提供了对计算机底层硬件的直接访问能力,而指针就是实现.............
C 的委托(Delegate)确实是一个在某些方面颇为独特的设计,它的普及度在其他主流语言中不如 C 本身那样高,这背后有多方面的原因,并非单一技术优劣就能完全解释。我们可以从几个层面来深入探讨一下。首先,需要理解委托在 C 中的核心作用。委托本质上是一种类型安全的方法指针。它定义了一个方法的签名(.............
在 C 语言中,`for` 和 `while` 循环都是用于重复执行一段代码的结构。从 C 语言的语义角度来看,它们的功能可以相互转换,也就是说,任何一个 `for` 循环都可以用 `while` 循环来实现,反之亦然。然而,当我们将这些 C 代码翻译成底层汇编语言时,它们的实现方式以及由此带来的细.............
在 C 语言中,`x += 5 == 4` 这个表达式可能看起来有些奇特,但它是一个合法的、并且在某些情况下会令人困惑的 C 语言语句。要理解它的含义,我们需要分解它,并深入了解 C 语言中运算符的优先级和求值顺序。首先,让我们分解这个表达式:这个表达式由两个主要部分组成:1. `x += 5`:.............