内存空间如何访问

我们使用的内存的基本存储单位是字节,一个字节由8个二进制位组成。每个字节都会按照一定的规则编号,这个编号就是该字节存储单元的地址。计算机就是利用这种编号也就是字节存储单元的地址来定位内存进行数据读写的。

我们在访问内存中的数据时,有两种方式,一种是通过变量名,一种是通过地址。我们声明的每个变量都是占据内存空间的,前面也讲到了,char型占1个字节,float型占4个字节。

而内存空间的分配是在什么时候呢?全局变量、static静态变量等静态生存期变量在程序开始运行之前就被分配了内存空间,动态生存期的变量是在变量声明时分配内存空间的,然后变量名也代表了分配的空间。

但是有时候没有变量名可用或者很不方便,例如,在动态内存分配时就没有变量名可以用,这个会在后面讲;调用函数传递很多参数时,就不可能一个一个的通过变量名传递,而是需要用地址传递。

给大家形象的说下存储地址:每个学生住一个宿舍,学生相当于变量,宿舍相当于存储单元,我们可以用学生的名字来找到他,这就是变量名的方式,也可以通过宿舍号找到他,这就是通过地址访问的方式。

C++中的指针类型就是用来存放上面讲的内存单元地址的变量类型。

指针变量的声明

指针跟int等一样也是一种数据类型,指针类型的变量就是指针变量,指针变量存放的是内存单元的地址。

以前我们都是通过变量名访问变量,是一种直接的方式,而通过指针访问变量是间接的。

例如,张三住在哪个宿舍不知道,可以在宿舍名单上第一行看到,那么宿舍名单的第一行就是指针变量,第一行上写的内容就是指针变量中存放的内容,而张三就是指针所指向的对象值。

指针同样是先声明再使用,声明的形式是:数据类型 *标识符;

我们注意到中间有个“*”,它表示声明的是一个指针变量。“*”前面的“数据类型”表示的是指针所指向的变量或对象的类型,可以是任意类型,也就是说在声明的该指针所指向的内存单元中可以存放此数据类型的数据。

而指针本身在32位系统上是unsigned long类型的,在64位系统上是unsigned _int64类型的,这里可能大家糊涂了,怎么又出来一个类型?结合上面张三的例子跟大家解释下,声明中的“数据类型”指定的是张三的类型,指针本身的类型指的是宿舍名单第一行的类型,清楚了吧。

例如,int *p;声明了一个指针变量p,它指向int类型的数据,用来存放int型数据的地址。

地址相关运算–“*”和“&”

“*”“&”可能大家已经见过了,作为二元操作符时,“*”表示相乘,“&”表示位运算里的与运算。在上面的指针变量的声明中,“*”用来表示声明的是一个指针变量。“&”在变量声明语句中出现在变量名左边时表示声明的是引用。而现在要跟大家讲的是它们的另外一种用法–地址运算。

“*”在地址运算中叫做指针运算符,表示指针指向的变量的值,是一元操作符,例如,如果p是一个int型的指针,则*p表示p指向的int型数据的值。“&”在地址运算中叫做取地址运算符,也是一个一元操作符,用来获取一个对象的地址,例如,有一个变量i,&i就表示变量i的存储单元地址。

提醒大家注意一下“*”“&”出现在声明语句中和在执行语句中意义是不一样的。

“*”出现在声明语句中被声明的变量名之前时,表示声明的是指针,例如,int *p;“*”出现在声明语句的初值表达式中或者执行语句中时,表示指针指向的对象的内容,例如,int i=*p; cout<<*p;“&”出现在声明语句中被声明的变量名之前时,表示声明的是引用,例如,int &rf;“&”出现在声明语句的初值表达式中或者执行语句中时,表示取对象的地址,例如:

int x;
int y;
int *p1=&x;
int *p2;
p2=&y;

指针变量的声明、地址相关运算--“*”和“”相关推荐

  1. 翁恺老师C语言学习笔记(十)指针_指针变量就是记录地址的变量

    指针变量就是记录地址的变量 scanf函数 · 如果能够将取得的变量的地址传递给一个函数,能否通过这个地址在那个函数内访问这个变量 · scanf("%d", &i) · ...

  2. 翁恺老师——指针变量和输入地址的变量

    指针 就是保存地址的变量 int i; int* p=&i;//p是一个指针,*表示指针p指向的是一个int,把i的地址交给了p,p里面存放的是i的地址 int *p,q; int* p,q; ...

  3. C语言指针变量的运算

    前言 指针变量也是可以进行运算的,如指针变量对其自身加上某个整数或减去某个整数,这在内存上体现为:相对这个指针向后偏移多少个单位或向前偏移了多少个单位,这里的单位与指针变量的类型有关.在32bit环境 ...

  4. C指针3:指针变量的运算

    由上节介绍我们知道,通过指针可以修改内存上的数据,并进一步可以交换数据.这种操作实际上也是在对地址进行操作运算.具体怎么实现指针变量的元素呢?为什么能实现指针变量的运算呢? 因为指针变量保存的是地址, ...

  5. 对指针变量取地址_C语言指针简介(amp;和*运算符)

    取地址符(&) 和  取值符(*) (1)& 运算符 :用于取一个对象的地址 例如:int *p;    p = &c;    将c的地址赋值给指针变量p,我们称p为 &quo ...

  6. C语言_字符串的地址以及指向字符串的指针变量的定义

    一.字符串的地址以及指向字符串的指针变量的定义. 1. 字符常量:用单引号括起来的一个字符.2. 字符串常量:用双引号括起来的一串字符.3. 注意:由于变量只能存放一个字符,所以字符串只能存储在数组当 ...

  7. 地址、指针、指针变量详解

    指针和指针变量的关系 指针就是地址,地址就是指针. 地址就是一个内存单元的编号,如1001 (地址值(简称地址)不可以是小数,也不可以是负数). 指针变量就是存放内存地址的变量. 指针和指针变量是两个 ...

  8. c语言 乘号 指针 避免,C语言指针篇(一)指针与指针变量

    指针 1. 什么是指针? 2. 指针可不可怕? 3. 指针好不好玩? 4. 怎么学好指针? C语言是跟内存打交道的语言,指针就是内存地址.指针无处不在,指针并不可怕,相反,等你学到一定程度后,会有一种 ...

  9. c语言中字符指针变量输入,C语言指针基础知识实例讲解

    对程序进行编译的时候,系统会把变量分配在内存单位中,根据不同的变量类型,分配不同的字节大小.比如int整型变量分配4个字节,char字符型变量分配1个字节等等.被分配在内存的变量,可以通过地址去找到, ...

最新文章

  1. 失业后跑摩的985高校硕士,被质疑学历、深“扒”论文...
  2. 约等于全自动爬取CVE基础信息
  3. Linux Kernel TCP/IP Stack — L1 Layer — NIC Controller — SKB
  4. emwin生成c文件格式的汉字库,GB2312编码,模拟器可用
  5. 面试题整理 4 合并两个排序的数组
  6. 不会这几个库,都不敢说我会Python爬虫
  7. python迭代-可迭代对象与迭代器对象
  8. HBase Filter 过滤器概述
  9. html placeholder 兼容问题,解决placeholder的兼容性
  10. python100例详解-【学习笔记】python100例
  11. 用大数据挑选出国外最值得看的前50条swift教程(v.2019)
  12. Mysql中Regexp常见用法
  13. java的小区车辆管理系统_基于Java的小区车辆信息管理系统的设计与实现
  14. 黑莓BlackBerry手机刷机ROM常见问题
  15. OutMan——Foundation框架中的NSDate类、NSCalendar类以及NSFileManager类
  16. mapreduce新编程实例
  17. 招聘-大数据开发工程师
  18. 将“闲置资源”重新利用,这家公司重组闲置市场
  19. Spring 最常用的几大类常用注解总结,史上最强整理!
  20. nginx安全漏洞(CVE-2021-23017)修复

热门文章

  1. mifare classic 2.2.3中文_Adobe Lightroom Classic CC 2019 v8.4.1 中文完整直装版
  2. CentOS中nginx负载均衡和反向代理的搭建
  3. [Lintcode]66. Binary Tree Preorder Traversal/[Leetcode]144. Binary Tree Preorder Traversal
  4. 关于Java中子类调用父类方法
  5. Android初学第55天
  6. 第十四届华中科技大学程序设计竞赛--J Various Tree
  7. 二叉树:通过前序遍历与中序遍历序列输出二叉树的后序遍历序列
  8. 第一章:T-SQL查询与编程基础
  9. requestAnimationFrame()
  10. Spring+Struts集成(方案一)