C/C++二级指针

理解二级指针,先要理解指针
假有定义:

int a = 10, *p;
p = &a;

那么:
p:存放的是&a,根据表达式p = &a; 这个很好理解
&p: 指针变量p在内存中的地址
*p:一级解引用,即为a的值
再有定义:

int **p2;
p2 = &p;

那么:
p2:存放的是p在内存的中的地址。
目前都很好理解
那么 *p2里存放的是什么呢
首先p2中存放的是p在内存中的地址,那么 *p2就是对p的地址进行解引用,得到p的地址中所存放的数据,由表达式

p = &a;

可知:p中所存放是a在内存中的地址,所以*p2中值应该等于&a
那么 **p2就是对 *p2进行解引用,由上陈述可知: *p2存放的是变量a在内存中的地址,则 **p2应该是对a所在的内存地址进行解引用,应该是变量a的值,为10;

主要是要理解:指针变量中存放的是一个地址,指针变量本身也是个变量,它自身在内存也存放在某个地址上,对指针变量进行解引用是对它存放的地址进行解引用,得到为这个变量中所存放的地址中的数据。

#include <iostream>
using namespace std; // namespace std;

typedef struct TNode
{
    int data;
    int data2;
    TNode *next;
}TNode;


bool Func1(void)
{
    int a = 10, b = 50, c = 50;
    int *p1, **p2;
    p1 = &a;
    p2 = &p1;
    cout << __LINE__ << ":*p1=" << *p1 << endl;  //输出p1一级解引用的结果
    cout << __LINE__ << ": p1=" << p1 << endl;   //输出p1中存放的数值, 应该是a的地址(&a)
    cout << __LINE__ << ": &a=" << &a << endl;   //输出a的存放地址
    cout << __LINE__ << ":&p1=" << &p1 << endl;  //输出p1的地址
    cout << __LINE__ << ":**p2=" << **p2 << endl; //输出p2二级解引用结果
    cout << __LINE__ << ":*p2=" << *p2 << endl;  //输出p2的一级解引脚的结果,应该是p1的地址
    cout << __LINE__ << ": p2=" << p2  << endl;  //输出p2中存放的内容,应该是p1的地址
    cout << __LINE__ << ":&p2=" << &p2 << endl; //输出&p2,是p2在内存中的值
    return true;
}
int main(void)
{
    Func1();
    return 0;
}

运行结果:
18: *p1=10
19: p1=0x7ffffffed92c
20: &a=0x7ffffffed92c
21: &p1=0x7ffffffed938
22: **p2=10
23: *p2=0x7ffffffed92c
24: p2=0x7ffffffed938
25: &p2=0x7ffffffed940

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。