变量与指针、取值符与取地址符

  • 一、基础知识
  • 二、实例
  • 其他

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 —— 工位——指针存放的地址


二、实例

用一些例子进一步说明、理解

  1. 交换两个变量的值
/*交换两个变量的值(排序算法中常用到)*/
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位。

  1. 交换两个指针变量的值
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(交换指向的地址)。自始至终呢,任务号对应的任务内容(两个地址中存放的值)并没有变。


其他

  1. 上述内容应该是对的,也不排除有说错的地方。
  2. 暂时写到这里,如果以后有更多理解和实例会继续补充。
  3. 欢迎大家讲出自己的理解。

变量与指针、取值符与取地址符相关推荐

  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 ...

  2. jquery radio取值,checkbox取值,select取值,radio选中,checkbox选中,select选中

    例:将多个选中的checkbox的值组装成一个字符串 <script type=text/javascript> function addMem(){ //var followers = ...

  3. jquery radio取值,checkbox取值,select取值,radio选中,

    jquery radio取值,checkbox取值,select取值,radio选中, var item = $('input[@name=items][@checked]').val(); 获取se ...

  4. Session存值取值问题及取不到值的问题

    Session存值取值问题及取不到值的问题 一.存值(相当于map) request.getSession().setAttribute("key", value); 二.取值 r ...

  5. zabbix web前端取值同后端取值不一致

    目前部署了zabbix3.0作为生产的监控系统,最近发现一个有趣的问题,就是套用percona公司的percona moinitor plugins中MySQL的监控模板的时候,有些agent的机器在 ...

  6. thymeleaf 获取yml中的值_Thymeleaf前后端传值 页面取值与js取值

    目的: 后端通过Model传值到前端 页面通过Model取值显示 js通过Model取值作为变量使用 1.后台Controller @GetMapping("/message") ...

  7. Thymeleaf前后端传值 页面取值与js取值

    目的:    后端通过Model传值到前端    页面通过Model取值显示    js通过Model取值作为变量使用 1.后台Controller @GetMapping("/messag ...

  8. java map 遍历取值_Map 遍历取值及jstl的取值

    学习了:http://blog.csdn.net/yanjiaye520/article/details/17354239 1.Java map的便利取值 Java代码 收藏代码 Map map = ...

  9. java map随机取值_HashMap随机取值和迭代器取值的对比

    一共四中方法,前两种是迭代器取值,后两种是随机取值,循环了5000万次,时间分别为:迭代器读取的速度大约是随机读取的速度的1.5倍,数据量越大,差距越明显. 另外,插入是读取的100倍左右的时间(这个 ...

  10. struts2 页面取值_Struts2页面取值 大总结

    Struts2页面取值: 后总结出了4种拿到值得办法: ${username} (#session. #application.类似) 1. Struts2页面开发中常用标签使用说明 1.1.往act ...

最新文章

  1. Elasticsearch——Rest API中的常用用法
  2. Centos Git1.7.1升级到Git2.2.1
  3. Java 缓冲流简介及简单用法
  4. C语言再学习 -- 时间函数
  5. Harfbuzz API 基本用法
  6. leetcode算法—两数之和 Two Sum
  7. solr 6.5.1 创建core失败的原因 Can‘t find resource ‘solrconfig.xml‘
  8. 小程序的侵权“生死局”
  9. 计算机0812是学硕还是专硕,的计算机是专硕还是学硕
  10. lucene中文分词搜索的核心代码
  11. 值得借鉴:耗时两个月的求职经历
  12. confluence开发,实现与现有单点登录sso系统对接。
  13. python 计算斜率
  14. 任何一个二目关系都是BCNF
  15. 避风港暗流涌动,优衣库优势不再
  16. json表格显示js方法_将JSON导入Google表格的3种最佳方法[最终指南]
  17. 简单模拟鼠标键盘操作
  18. 土地利用规划之平时作业二
  19. 如何使用WGCLOUD实时监控网站状态并告警
  20. 2023最新版easyrecovery数据恢复软件免费版测评

热门文章

  1. python生成递归json_python函数、递归、json模块操作
  2. SpringCloud - GateWay服务网关
  3. R语言使用order函数对dataframe数据进行排序、基于多个字段(变量)进行升序排序(ASCENDING)
  4. binlog2sql 恢复工具使用
  5. python 判断是否有某个属性_python如何判断对象的某个属性
  6. suse账号解锁_Linux多次登录失败用户被锁定使用Pam_Tally2解锁
  7. 【底层思维】思维的深度决定人生的高度,底层思维的4个方法论
  8. GSM劫持+短信嗅探是什么,如何防范指南
  9. Unity文档——AssetBundle使用模式
  10. 彩色喷头程序开发项目外包