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

C语言二级指针使用求助:地址不符与编译错误问题

问题解答

一、双指针的地址关系澄清

你误以为所有变量的地址应该相等,这是对指针内存模型的误解:

  • d 是普通int变量,占用独立内存块,&d 是它的地址
  • k 是一级指针变量,它的存储值是 d 的地址(&d),但k自身也占用一块内存,&k 是它自己的地址
  • p 是二级指针变量,它的存储值是 k 的地址(&k),p自身同样有独立地址 &p

对应你的输出:

  • printf("the address value of our variable k is %p",k); 输出的是k存储的内容,也就是d的地址,所以和&d相等
  • printf("the address value of our variable p is %p",p); 输出的是p存储的内容,也就是k的地址,所以和&k相等
  • 每个变量(包括指针本身)的地址都是唯一的,这才是正确的内存逻辑

二、用#赋值编译失败的问题

你注释里提到的“用#给指针赋值”是完全错误的用法:

  • C语言中,取变量地址必须用取地址运算符&,比如k=&d;是正确写法,它将d的地址赋值给指针k
  • #是预处理指令符号,仅用于#include、#define这类预处理操作,不能用来做变量赋值,用它赋值会直接触发编译错误

修正后的示例代码

#include <stdio.h>
int main()
{
/* POINTER TO POINTER*/
 int d;
 int *k;
 int **p;
d=12;/* 变量d的数值 */
k=&d; /* 取d的地址赋值给一级指针k */
p=&k; /* 取k的地址赋值给二级指针p */

// 打印数值
printf("the value of d is %d\n",d);
printf("the value obtained by dereferencing k is %d\n",*k); // 解引用k得到d的数值
printf("the value obtained by double dereferencing p is %d\n",**p); // 两次解引用p得到d的数值

// 打印地址
printf("the address of d is %p\n",&d); // d自身的地址
printf("the address stored in k is %p\n",k); // k存储的d的地址
printf("the address of k itself is %p\n",&k); // k自身的地址
printf("the address stored in p is %p\n",p); // p存储的k的地址
printf("the address of p itself is %p\n",&p); // p自身的地址

return 0;
}

这段代码会清晰区分每个变量的自身地址和指针存储的地址,避免混淆。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:35:33