变量与指针、取值符与取地址符
变量与指针、取值符与取地址符
- 一、基础知识
- 二、实例
- 其他
by HPC_ZY
也是偶然,在一个项目中需要多次交换二维数组中的值,逐个操作确实耗时,就想能不能利用指针操作快速交换。成功后写此文,记录分享。
一、基础知识
通过几个例子谈谈变量、指针、地址、取地址等等
符号 | 名称 | 作用对象 | 作用 |
---|---|---|---|
& | 取地址符 | 变量 | 返回变量所在的地址 |
* | 取值符 | 指针(地址) | 返回指针指向地址里存储的值 |
一个简单的例子
/* 取值符与取地址符*/
void main()
{// 初始化int *a = new int[1];a[0] = 123;// 取指针指向的值printf("a[0] = %d\n", a[0]); // 最常用的取值方式printf("*a = %d\n", *a); // 利用取值符 // 取指针地址printf("a = %0x\n", a); // 最常用的取地址(a本来就是指针,存的地址)printf("&a[0] = %0x\n", &a[0]); // 利用取地址符 // 取存储指针的地址printf("&a = %0x\n", &a); // 利用取地址符 // 结束printf("done");getchar();
}
某一次运行结果如下(每一次运行结果都是不一样的,因为会分配到不同地址)
操作 | 值 | 描述 |
---|---|---|
a[0] | 123 | 获取指针a指向的第一个内存地址中存储的值 |
*a | 123 | 获取指针a指向内存地址中存储的值 |
a | 0xf0595f40 | 获取指针a指向的地址 |
&a[0] | 0xf0595f40 | 获取指针a指向的第一个值的地址 |
&a | 0x58fffb48 | 获取指针a在内存中的地址 |
打个比方(如下图),就好比办公室内有8个工位,小a被安排到5号工位(即a的地址),他接收到任务1(a指向的地址),任务1的内容是做一个ppt(a指向地址中存放的值)。
那么对应起来就是,
1)a[0] / *a ——任务具体内容——指针指向的地址中存放的值
2) a / &a[0]——任务号——指针指向的地址
3) &a —— 工位——指针存放的地址
二、实例
用一些例子进一步说明、理解
- 交换两个变量的值
/*交换两个变量的值(排序算法中常用到)*/
void main()
{// 初始化int a = 23;int b = 7;int tmp;// 显示printf("a = %d\n", a);printf("&a = %0x\n", &a);printf("b = %d\n", b);printf("&b = %0x\n", &b);// printf("tmp = %d\n", tmp); 因为没有初始化,所以不能写这一句printf("&tmp = %0x\n\n", &tmp); // 交换tmp = a;a = b;b = tmp;// 显示printf("a = %d\n", a);printf("&a = %0x\n", &a);printf("b = %d\n", b);printf("&b = %0x\n", &b);printf("tmp = %d\n", tmp);printf("&tmp = %0x\n\n", &tmp);printf("done");getchar();
}
我某一次运行的结果如下表所示(每一次运行结果都是不一样的,因为会分配到不同地址)
a | b | tmp | &a | &b | &tmp | |
---|---|---|---|---|---|---|
操作前 | 23 | 7 | / | 0xee3ffa54 | 0xee3ffa74 | 0xee3ffa94 |
操作后 | 7 | 23 | 23 | 0xee3ffa54 | 0xee3ffa74 | 0xee3ffa94 |
从上表可以看出,交换只修改变量的值,不会修改变量在内存中储存的位置(地址)。这里顺便提一下,我们可以看到a,b,tmp的地址依次相差32(注意表中地址以十六进制显示),因为在我的电脑里int类型为32位。
- 交换两个指针变量的值
void main2()
{// 初始化int *a = new int[1];int *b = new int[1];a[0] = 27;b[0] = 9;int *tmp;// 显示printf("*a = %d\n", *a);printf("a[0] = %d\n", a[0]);printf("a = %d\n", a);printf("&a = %0x\n", &a);printf("b[0] = %d\n", b[0]);printf("b = %d\n", b);printf("&b = %0x\n", &b);printf("&tmp = %0x\n\n", &tmp);// 交换tmp = a;a = b;b = tmp;// 显示printf("a = %d\n", a);printf("&a = %0x\n", &a);printf("b = %d\n", b);printf("&b = %0x\n", &b);printf("tmp = %d\n", tmp);printf("&tmp = %0x\n\n", &tmp);printf("done");getchar();
}
我某一次运行的结果如下表所示(每一次运行结果都是不一样的,因为会分配到不同地址)
a | b | tmp | *a | *b | *tmp | &a | &b | &tmp | |
---|---|---|---|---|---|---|---|---|---|
操作前 | 0x23A35850 | 0x23A35890 | / | 27 | 9 | / | 0x7E7F5758 | 0x7E7F5778 | 0x7E7F5798 |
操作后 | 0x23A35890 | 0x23A35850 | 0x23A35850 | 9 | 27 | 27 | 0x7E7F5758 | 0x7E7F5778 | 0x7E7F5798 |
从上表可以看出,这次我们只交换了a,b指向的地址,而没有修改对应地址中存储的数值。
地址0x23A35850中依旧存的27,地址0x23A35890中依旧存的9。
就好比,小a小b安排到5、6号工位(即a、b的地址),又分别拿到任务1、任务2(a、b指向的地址);后面老板又让他们把任务交换一下,小a做任务2,小b做任务1(交换指向的地址)。自始至终呢,任务号对应的任务内容(两个地址中存放的值)并没有变。
其他
- 上述内容应该是对的,也不排除有说错的地方。
- 暂时写到这里,如果以后有更多理解和实例会继续补充。
- 欢迎大家讲出自己的理解。
变量与指针、取值符与取地址符相关推荐
- sql-case when 条件1 then 取值1 when 条件2 then 取值2 else 取值3 end
遇到 XXX情况 就 XXX 遇不到就 XXX 结束 case when -- then -- else -- end 例如一个3条件取值的字段: case when 条件1 then 取值1 whe ...
- jquery radio取值,checkbox取值,select取值,radio选中,checkbox选中,select选中
例:将多个选中的checkbox的值组装成一个字符串 <script type=text/javascript> function addMem(){ //var followers = ...
- jquery radio取值,checkbox取值,select取值,radio选中,
jquery radio取值,checkbox取值,select取值,radio选中, var item = $('input[@name=items][@checked]').val(); 获取se ...
- Session存值取值问题及取不到值的问题
Session存值取值问题及取不到值的问题 一.存值(相当于map) request.getSession().setAttribute("key", value); 二.取值 r ...
- zabbix web前端取值同后端取值不一致
目前部署了zabbix3.0作为生产的监控系统,最近发现一个有趣的问题,就是套用percona公司的percona moinitor plugins中MySQL的监控模板的时候,有些agent的机器在 ...
- thymeleaf 获取yml中的值_Thymeleaf前后端传值 页面取值与js取值
目的: 后端通过Model传值到前端 页面通过Model取值显示 js通过Model取值作为变量使用 1.后台Controller @GetMapping("/message") ...
- Thymeleaf前后端传值 页面取值与js取值
目的: 后端通过Model传值到前端 页面通过Model取值显示 js通过Model取值作为变量使用 1.后台Controller @GetMapping("/messag ...
- java map 遍历取值_Map 遍历取值及jstl的取值
学习了:http://blog.csdn.net/yanjiaye520/article/details/17354239 1.Java map的便利取值 Java代码 收藏代码 Map map = ...
- java map随机取值_HashMap随机取值和迭代器取值的对比
一共四中方法,前两种是迭代器取值,后两种是随机取值,循环了5000万次,时间分别为:迭代器读取的速度大约是随机读取的速度的1.5倍,数据量越大,差距越明显. 另外,插入是读取的100倍左右的时间(这个 ...
- struts2 页面取值_Struts2页面取值 大总结
Struts2页面取值: 后总结出了4种拿到值得办法: ${username} (#session. #application.类似) 1. Struts2页面开发中常用标签使用说明 1.1.往act ...
最新文章
- Elasticsearch——Rest API中的常用用法
- Centos Git1.7.1升级到Git2.2.1
- Java 缓冲流简介及简单用法
- C语言再学习 -- 时间函数
- Harfbuzz API 基本用法
- leetcode算法—两数之和 Two Sum
- solr 6.5.1 创建core失败的原因 Can‘t find resource ‘solrconfig.xml‘
- 小程序的侵权“生死局”
- 计算机0812是学硕还是专硕,的计算机是专硕还是学硕
- lucene中文分词搜索的核心代码
- 值得借鉴:耗时两个月的求职经历
- confluence开发,实现与现有单点登录sso系统对接。
- python 计算斜率
- 任何一个二目关系都是BCNF
- 避风港暗流涌动,优衣库优势不再
- json表格显示js方法_将JSON导入Google表格的3种最佳方法[最终指南]
- 简单模拟鼠标键盘操作
- 土地利用规划之平时作业二
- 如何使用WGCLOUD实时监控网站状态并告警
- 2023最新版easyrecovery数据恢复软件免费版测评
热门文章
- python生成递归json_python函数、递归、json模块操作
- SpringCloud - GateWay服务网关
- R语言使用order函数对dataframe数据进行排序、基于多个字段(变量)进行升序排序(ASCENDING)
- binlog2sql 恢复工具使用
- python 判断是否有某个属性_python如何判断对象的某个属性
- suse账号解锁_Linux多次登录失败用户被锁定使用Pam_Tally2解锁
- 【底层思维】思维的深度决定人生的高度,底层思维的4个方法论
- GSM劫持+短信嗅探是什么,如何防范指南
- Unity文档——AssetBundle使用模式
- 彩色喷头程序开发项目外包