You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法通过强制转换处理指针指针变量而无需使用双星号?

问题分析与解决

你的代码核心问题是指针类型不匹配,导致后续的地址解析完全错误。

错误根源

p0 是 int* 类型,它的地址 &p0 的类型是 int**(指向指针的指针),但你错误地将其赋值给了 int* 类型的 p1。这种隐式类型转换是不安全的,编译器通常会发出警告。

错误过程拆解

  1. 执行 int *p1 = &p0; 时,p1 存储的是 p0 的内存地址,但它的类型被错误标记为 int*。
  2. 读取 *p1 时,程序会把 p0 的地址(一个指针值)当成 int 类型的数据读取——这个值并不是 x 的地址,而是 p0 变量本身的地址。
  3. 将这个错误的 int 值强制转换成 int* 并解引用,自然无法得到 x 的值,甚至可能触发非法内存访问。

正确写法

要实现指向指针的指针,只需把 p1 的类型改为 int**:

int x = 20;
int *p0 = &x;
int **p1 = &p0; // 正确声明为指向指针的指针
printf("*p0 = %d\n", *p0);
printf("**p1 = %d\n", **p1); // 直接解引用两次即可,无需强制转换

这段代码会输出你预期的结果:

*p0 = 20
**p1 = 20

内容的提问来源于stack exchange,提问作者Mohammed Amer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 22:24:32