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
相关产品推荐
相关产品推荐

