**关于如何理解指针变量的地址和存储的值的问题
C语言程序代码:
//测试指针地址和指针的指针的地址
#include<stdio.h>
int main(void)
{
//定义
int i = 1, a[5] = {10,20,30,40,50};
int *p1;
int **p2;
int *p3;
int **p4;
//指针初始化
p1 = &i;
p2 = &p1;
//指针指向一个数时
printf("p1存储的地址p1=%p,p1自身的地址p1=%p,p1指向的地址的值*p1=%d\n", p1,&p1,*p1);
printf("p2存储的地址*p2=%p,p2自身的地址p2=%p,p2指向的地址指向的值**p2=%d\n",*p2,&p2,**p2);
//指针指向一个数组时
p3 = a;
p4 = &p3;
printf("p3存储的地址p3=%p,p3自身的地址p3=%p,p3指向的地址的值*p3=%d\n", p3, &p3, *p3);
printf("p4存储的地址*p4=%p,p4自身的地址p4=%p,p4指向的地址指向的值**p4=%d\n", *p4, &p4, **p4);
}
运行结果:
问题点:
p2为指针的指针,p2应该存储p1自身的地址,即应该为: 0057FA68但根据运行结果,p2却存储了p1指向的地址0057FA90
p4类似
还望赐教,不胜感激!
你是理解了的,但是输出的时候你输出了 &p2,你应该输出p2变量的地址,你应该直接输出p2,&p2是p2这个变量的地址了,这个地址需要你使用一个三级指针去指向它了。
P2 = &P1;
那意味着
p2就是&p1
*p2 就是p1
**p2 就是 *p1
简单举个例子吧
int a,*p;
a=20;
p=&a;
1️⃣int a,*p; //p是指向整型数据的指针,a是整数类型的一个变量
2️⃣a=20; //a的地址空间处存储着一个整型数据——20
3️⃣p=&a; //指针变量p存储的是整型变量a的地址
如果输出这两者的地址的话,这两者地址是一样的,存储的值也是一样的即:都是20。
如有帮助,还请帮忙点下采纳!感谢!
说说我对这方面的理解,个人不规范的理解:
这里主要理解的是指针是啥,地址是啥,
取地址:针对一个变量A,我们可以用取地址符&取它的地址(该变量在内存中存储的位置,可以立即为数组(假设磁盘是个很大的数组)的下标位置)
指针:针对变量A,我们可以用&符取其地址,而指针*,个人理解,就是一个存储地址变量(有类型(char*, int *))的变量,可以用指针存储这种变量的地址,也就是通过这个地址可以找到对应位置的变量, 既然指针是存储一个变量的地址,也就是存储了的是一个数组的下标,这个指针本身也是一个变量喽~
指针的指针,又是针对这个指针变量取地址,存储的是这个指针(存储变量的地址(也是一个数值,可以理解为数组下标)),也就是说,指针的指针,存储的是一个指针变量的地址。
变量: 存储在磁盘中,把磁盘当作一个很大的数组,那就是说存储在很大数组中的一个位置,
变量的地址:可以理解为变量在这个很大数组中的数组下标
指针:个人理解就是地址,就是存储了变量的地址(也就是数组下标),说白了,也就是存储了一个数值。
指针的指针: 既然指针内存储的是一个数组,指针可以理解为int同级别的那种类型关键字,可以对指针取地址,再用一个指针,存储这个指针再内存中的地址。
(可以通过指针的指针中存储的地址,找到存储指针的下标,取到对应位置存放的变量(这个变量实际上还是一个指针),再根据这个变量(指针)找到对应位置的变量。。。) 依次类推,说白了再继续存指针的指针的指针逻辑上都可通~
我做了一个关于指针的值和地址的关系图如下: