为何无法通过强制转换处理指针指针变量而无需使用双星号?
问题分析与解决
你的代码核心问题是指针类型不匹配,导致后续的地址解析完全错误。
错误根源
p0 是 int* 类型,它的地址 &p0 的类型是 int**(指向指针的指针),但你错误地将其赋值给了 int* 类型的 p1。这种隐式类型转换是不安全的,编译器通常会发出警告。
错误过程拆解
- 执行
int *p1 = &p0;时,p1存储的是p0的内存地址,但它的类型被错误标记为int*。 - 读取
*p1时,程序会把p0的地址(一个指针值)当成int类型的数据读取——这个值并不是x的地址,而是p0变量本身的地址。 - 将这个错误的
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
相关产品推荐
相关产品推荐

