之前对*和&符号一直理解的比较浅显。只知道: 
*p好像表示的是一个指针; 
&p表示的是一个地址。 
然而这次当遇到了下面这个情况的时候: 
int a = 10; 
int *b = &a;

printf(“%d\n”, a); 
printf(“%d\n”, &a); 
printf(“%d\n”, b); 
printf(“%d\n”, *b);

结果: 
10 
6487620 
6487620 
10

一脸懵逼,为什么&a和*b的值不是一样?这才发现自己其实一点都没有搞懂。

经过学习后,总结出来: 
变量a 本质上代表一个存储单元。CPU通过该存储单元的地址访问该存储单元中的数据。所以a本来代表两个值:存储单元的地址和储单元中的数据。于是就有了二异性。为了消除这种二义性,C语言规定a表示存储单元中的数据,&a表示存储单元的地址。 
a存储单元中的数据可以是一个普通数值,也可以是另一个存储单元的地址,比如:a = &b; 语句就是将b的存储单元的地址存入a存储单元中。C语言规定*a代表a中存储的地址对应的存储单元中的数据,也就是访问*a就等于访问b,于是*a提供了通过a访问b中的数据的手段。

a表示a对应的存储单元中的数据。 
&a表示a对应的存储单元的地址。 
*a表示:首先,要求a对应的存储单元中的数据一定是另一个存储单元的地址。 
于是,*a表示另一个存储单元中的数据。 
当a声明的类型是int时,a中存储的是一个整数数值,通过a可以访问(读取或修改)这个数值。 
当a声明的类型是int*时,a中存储的是一个存储单元的地址,而该存储单元中存储的数据是一个整数数值;通过*a可以访问(读取或修改)这个数值。a == &*a 都是该存储单元的地址。 
当a声明的类型是int**时,a中存储的是一个存储单元的地址,而该存储单元中存储的数据是另外一个存储单元的地址,另外这个存储单元中存储的是一个整数数值;通过**a可以访问(读取或修改)这个数值。 

最后,C语言里地址叫指针。还有,在C语言中的数组本质上其实也是指针,即:*a 等同于 a[]。

int a = 10;

int *b = &a;

printf("%p\n",&a);    \\输出变量a自身地址

printf("%p\n", b);    \\输出指针b中指向的地址,即a地址

printf("%p\n", &b);    \\输出指针b自身的地址

printf("%d\n", a);    \\输出变量a中数据10

printf("%d\n", b);    \\输出指针b中存储的数据,5240892即为16进制004FF83C

printf("%p\n", b);    \\输出指正b中存储数据,以指针格式输出

printf("%d\n", *b);    \\输出指针b指向的地址内的数据,即a的数据

输出结果:

004FF83C
004FF83C
004FF830
10
5240892
004FF83C
10

综上:

&是取变量或指针自身的地址;

*是取指针中指向地址内的数据;

什么都不加,就是取该变量或指针中当前存储的数据。

C语言中的*和&符号的更多相关文章

  1. 浅谈C语言中的强符号、弱符号、强引用和弱引用

    摘自http://www.jb51.net/article/56924.htm 浅谈C语言中的强符号.弱符号.强引用和弱引用 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2014- ...

  2. 深入理解计算机系统(2.5)------C语言中的有符号数和无符号数以及扩展和截断数字

    上一篇博客我们讲解了计算机中整数的表示,包括无符号编码和补码编码,以及它们之间的互相转换,个人觉得那是非常重要的知识要点.这篇博客我们将介绍C语言中的有符号数和无符号数以及扩展和截断数字. 1.C语言 ...

  3. 关于C语言中的强符号、弱符号、强引用和弱引用的一些陋见,欢迎指正

    首先我表示很悲剧,在看<程序员的自我修养--链接.装载与库>之前我竟不知道C有强符号.弱符号.强引用和弱引用.在看到3.5.5节弱符号和强符号时,我感觉有些困惑,所以写下此篇,希望能和同样 ...

  4. 浅谈C语言中的强符号、弱符号、强引用和弱引用【转】

    转自:http://www.jb51.net/article/56924.htm 首先我表示很悲剧,在看<程序员的自我修养--链接.装载与库>之前我竟不知道C有强符号.弱符号.强引用和弱引 ...

  5. C语言中的强符号与弱符号

    转自:http://blog.csdn.net/astrotycoon/article/details/8008629 一.概述 在C语言中,函数和初始化的全局变量(包括显示初始化为0)是强符号,未初 ...

  6. C语言中的弱符号(weak)用法及实例

    一 符号概念: 在C语言中,有强符号和弱符号,符号简单来说就是函数.变量的名字,对于全局(非局部.非static)的函数和变量,能不能重名是有一定规矩的,强.弱符号就是针对这些全局函数和变量来说的. ...

  7. 《C语言深度剖析》学习笔记----C语言中的符号

    本节主要讲C语言中的各种符号,包括注释符.单引号双信号以及逻辑运算符等. 一.注释符 注释符号和注释在程序的预编译期就已经被解决了,在预编译期间,编译器会将注释符号和注释符号之间的部分简单的替换成为空 ...

  8. 【R语言入门】R语言中的变量与基本数据类型

    说明 在前一篇中,我们介绍了 R 语言和 R Studio 的安装,并简单的介绍了一个示例,接下来让我们由浅入深的学习 R 语言的相关知识. 本篇将主要介绍 R 语言的基本操作.变量和几种基本数据类型 ...

  9. scala中常用但其他语言不常见的符号含义

    本文旨在介绍Scala在其他语言中不太常见的符号含义,帮助理解Scala Code. 随着我对Scala学习的深入,我会不断增加该篇博文的内容. 修改记录 ----2016.11.23  新增scal ...

  10. 【 c语言中无符号和有符号的加法运算】【深入理解】--【sky原创】

    原文:[ c语言中无符号和有符号的加法运算][深入理解]--[sky原创]   第一题 #include<stdio.h> int main() { unsigned int a=6; i ...

随机推荐

  1. DDCA —— 片上网络互联

    1. 路由 1.1 网络拓扑示例 Grid(网格) 网络拓扑通常是一个二维矩阵形式,每个节点(处理器)与其上下左右相邻的节点相连. 如果节点在边缘,某些方向上可能没有相邻节点(边界节点). Torus ...

  2. 这些“人美话又多”的同事们:2022 Q1 招聘人员 评优名单公布

    ​ ​ 编辑 ​ 编辑 ​ 编辑 ​ 编辑 ​ 编辑 ​ 编辑 ​ 编辑 ​ 编辑 ​ 编辑 欢迎大家后台留言报名哈~ ​

  3. Java 和 native 的一些进展

    GraalVM Java 生成 DLL/SO https://medium.com/graalvm/3-ways-to-polyglot-with-graalvm-fb28c1542b45 Proje ...

  4. MySQL百万级数据量分页查询方法及其优化

    1. 直接用limit start, count分页语句, 也是我程序中用的方法: select * from product limit start, count 当起始页较小时,查询没有性能问题, ...

  5. Qt/C++音视频开发62-电子放大/按下选择区域放大显示/任意选取区域放大

    一.前言 电子放大这个功能思考了很久,也是一直拖到近期才静下心来完整这个小功能,这个功能的前提,主要得益于之前把滤镜打通了,玩出花样来了,只要传入对应的滤镜字符串,就可以实现各种各样的效果,然后查阅滤 ...

  6. Supermap Objects API开发中禁用默认的选择集显示风格,启用自定义的显示风格的代码

    //#region 使用自定义风格设置选中状态 Selection selection = new Selection();//从该记录集获取选择集 selection.FromRecordset(r ...

  7. [转]使用Unity进行3D开发的思路和主要技术优势

    此处直接附上别人撰写好的博文,分享给各位读者. 原文链接:Unity3D手游开发实践--<腾讯桌球:客户端总结>.

  8. asp.net core 3.0 发布单文件,进程外托管,复制视图

    <PropertyGroup> <TargetFramework>netcoreapp3.0</TargetFramework> <!--运行环境(发布单文件 ...

  9. 微信小程序开发基础详解

    1.结构 util.js      工具类 app.js          全局工具函数 app.json      小程序配置 app.wxss     全局样式 2.生命周期 onLoad(opt ...

  10. 在OERV也可以玩MC(上)

    最近发现一个比较有意思的事情,原来HMCL这个项目也移植到RISC-V上了,之前一直没有发现,因此在OERV(openEuler RISC-V的简称)玩MC也是可以的了.首先,HMCL是一款功能丰富的 ...