*,& 在指针操作中的意义

(1)*

大家都知道在写int *p 时,*可以声明一个指针。很少人知道*在C/C++中还有一个名字就是“解引用”。他的意思就是解释引用,说的通俗一点就是,直接去寻找指针所指的地址里面的内容,此内容可以是任何数据类型,当然也可以是指针(这就是双重指针,后面将会讨论)。需要注意的是,在变量声明的时候,*不能当做解引用使用,只是表示你声明的变量是一个指针类型。

example1:

int a=50;

int *p=&a;// '&'的作用就是把a变量在内存中的地址给提取出来,具体后面解释。

*p=5;//这就是解引用,*解释了 p对常量 50的内存地址的引用,解释结果就是直接去寻找p所指内容,因为p指向a,所以a的内容将被修改为5,而不是50。

(2) &

&表示的是引用,有&符号,就表示函数内的变量和主函数的变量是同一个,函数内改变它的值,主函数相应的变量也就跟着改变了;没有&符号,就表示函数内的变量是主函数的变量的一个副本,在函数内改变其值,是不会改变主函数中变量的值的。

& 在C/C++中具体 3种语义, 按位与,取地址 和 声明一个引用。

int a=0x0000002 & 0x00000003;//按位与

int *p=&a;//取地址,取出a在内存中的地址给p,这样就建立一个指针映射,使得p指a

int &a=b;//声明a是b的引用,对a操作修改也就是直接对b修改。

在指针操作中,&还有一种叫法叫做“脱去解引用”,在这个表达式中&*p(假设p是指针),&脱去了*对a的解引用,从而得到抵消的效果,得到应该是p所指的变量的地址。

example2:

接example1。

println(“%x ||||| %x”,&p,&*p);

输出结果:

p在内存中的地址|||||a在内存中的地址

为什么呢?

首先&去指针p的地址,然后&脱去了p对a中5的引用,解引用和脱去解引用效果抵消,从而得到了p所指的变量的地址,也就是a在内存中的地址。

关于C中指针的引用,解引用与脱去解引用的更多相关文章

  1. C++ 中指针与引用的区别

    指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过v ...

  2. 在C++中指针和引用传值区别

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...

  3. C++中 指针的指针是什么?指针的引用又是什么?你可能需要看看这篇文章

    关于变量的定义 我们都知道变量的定义包括一个基本数据类型(base type)和一组声明符,在同一条定义语句中,输入基本数据类型不同,但是声明符的形式却可以不同. //如:i是一个int的整数,a是一 ...

  4. php中引用符号(&amp;)的使用详解

    php的引用就是在变量或者函数.对象等前面加上&符号,在PHP 中引用的意思是:不同的名字访问同一个变量内容,下面介绍如何使用PHP的引用 与C语言中的指针是有差别的.C语言中的指针里面存储的 ...

  5. C++中指针和引用、数组之间的区别

    指针指向一块内存,它的内容是所指内存的地址:而引用则是某块内存的别名,引用初始化后不能改变指向.使用时,引用更加安全,指针更加灵活. 初始化.引用必须初始化,且初始化之后不能呢改变:指针可以不必初始化 ...

  6. 转 浅谈C++中指针和引用的区别

    浅谈C++中指针和引用的区别 浅谈C++中指针和引用的区别   指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性 ...

  7. C/C++中指针和引用之相关问题研究

    一.基本知识 指针和引用的声明方式: 声明指针: char* pc; 声明引用: char c = 'A'                   char& rc = c; 它们的区别: ①从现 ...

  8. Java中“指针”的解释以及对“引用”的理解

    Java中"指针"的解释以及对"引用"的理解 初学Java面对对象编程,对于一些概念还真的有点难以理解,主要是因为不由自主的联系到以前学过的C语言知识,时不时的 ...

  9. C++中 指针 与 引用 的区别

    四点区别:可否为空,可否修改,使用时是否需要判断,使用场景 非空区别. 引用必须指向某个对象,而指针可以指向空. 可修改区别. 引用总是与初始化时的那个对象绑定,不可变更:指针可以重新赋值,指向另外一 ...

随机推荐

  1. MySQL 向表中插入、删除数据

    一.向表中插入一条信息 1.查看表中的数据 mysql> SELECT * FROM user; +----+---------+----------+ | id | account | pas ...

  2. Web前后端:如何分离,如何解耦?

    摘要:在本文中我们一起来探讨一下为什么要在软件开发中进行前后端的分离,如何做到前后端分离,如何解耦. 简单地说,就是要把复杂的问题简单化,把一个从0到N的问题转化为N个0到1的问题.另一个相近的说法就 ...

  3. DM8数据库备份还原的原理及应用

    (本文部分内容摘自DM产品技术支持培训文档,如需要更详细的文档,请查询官方操作手册,谢谢) 一.原理 1.DM8备份还原简介 1.1.基本概念 (1)表空间与数据文件 ▷ DM8表空间类型: ▷ SY ...

  4. JSOI 2008 【魔兽地图】

    其实这题是我从noip前就开始做的...那个时候打的Pascal,一直TLE,转了C++之后我又写了一遍,A了... 辛酸史:                      题目描述: DotR (Def ...

  5. Java源码详解系列(十一)--Spring的使用和源码

    Spring 是一个一站式的 Java 框架,致力于提高我们项目开发的效率.通过 Spring,我们可以避免编写大量额外代码,更专注于我们的核心逻辑.目前,Spring 已经成为最受欢迎的 Java ...

  6. Makefile-4-书写命令

    目录 前言 概念 Chapter 4:书写命令 4.1 显示命令 4.2 命令执行 * 4.3 命令出错 4.4 嵌套执行 make 4.5 定义命令包 参考 前言 本笔记主要记录Makefile一些 ...

  7. jquery的实时触发事件(textarea实时获取中文个数)

    jquery的实时触发事件(textarea实时获取中文个数) (2014-09-16 11:49:50) 转载▼ 标签: 实时触发事件 中文个数 onpropertychange oninput o ...

  8. 【源码项目】C语言编程之火车票管理系统!(最强代码)

    大学计算机软件技术基础课程设计任务书 一.题目: 火车票信息管理系统: 二.目的与要求 : ● 目的培养学生综合利用C++语言进行程序设计的能力, ● 培养学生的编程能力.用计算机解决实际问题的能力, ...

  9. 【API管理 APIM】APIM集成内部VNet时,常遇见的关于自定义DNS服务问题。

    问题描述 Azure 的APIM集成虚拟网络有两种方式,外部VNET, 内部VNET. 外部VNET,要求低,可以通过APIM访问VNET中的VM等资源,不需要配置自定义DNS服务器,这种方式下,AP ...

  10. 面试官问:HashMap在并发情况下为什么造成死循环?一脸懵

    这个问题是在面试时常问的几个问题,一般在问这个问题之前会问Hashmap和HashTable的区别?面试者一般会回答:hashtable是线程安全的,hashmap是线程不安全的. 那么面试官就会紧接 ...