理解*pp和&p的关联

Posted xujih

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解*pp和&p的关联相关的知识,希望对你有一定的参考价值。

最近老师布置了一个题目,要我们理解c语言中 * 和 & 的用法,其中运行了这么一个程序:

    int v3,*p=&v3;
    printf("
=====理解*p、p和&p的关联:假设定义int v3,*p=&v3;======
");
    printf("局部变量v3的内存地址为:0x%08x;	局部变量v3=0x%08x;
",&v3,v3);
    printf("*p=0x%08x;	p=0x%08x;	&p=0x%08x

",*p,p,&p); 

看上去很简单,就是把几个的值输出来看一看,运行结果如下

技术图片

但有个地方我就一直没搞懂,*p=&v3,那么不应该输出的时候这两者相等吗?

结果显示这两者根本不相等。

后来经我室友提醒,我才发现是我一开始的时候理解错了,p在被定义的时候被赋值不能理解为&v3的值赋值给*p,而应该拆开来理解

int v3,*p=&v3;

就应该等价于

int v3;
int *p;
p=&v3;

都是c语言“模糊不清”的变量声明惹的祸!

在golang中,在声明变量时将变量的类型放在变量的名称之后,例如

var a,b int  //go语言中变量声明的方式

这里就是声明了a,b两个int型变量,咋一看这种变化也没太大好处,再看看c中的其他定义

int *a,b; //这里a是int类型的指针,但b不是,b是int型
//它还可以这样写,对初学者来说更有迷惑性
int* a,b; //其实这样和上一句是一样的
int *c,*d; //此时c,d都是int指针

go语言

var a,b int //a,b是int类型
var c,d *int //c,d是int指针

这样的设计仁者见仁吧,哈哈。

以上是关于理解*pp和&p的关联的主要内容,如果未能解决你的问题,请参考以下文章

以下代码片段 C++ 的说明

取消引用和后缀的优先级

Swift 协议扩展中的“关联类型”难以理解

如何在 Javadoc 中使用 @ 和 符号格式化代码片段?

Sphinx - 在代码块片段中使用省略号 (...)

EF添加关联的提示问题:映射从第 260 行开始的片段时有问题: