C语言 指针 swap问题

在主函数种实现变量的交换

现在我们把这交换的行为封装进方法中

swap函数确实进行了交换,打印也是10和5了,但是下面a和b的结果还是5和10

- 形参i 和 形参j 并不是和 a,b一个变量,实参 a,b 传递值给形参 i,j

- 形参i 和 形参j ,还有temp变量,在内存也分配了空间,main函数跳转至swap函数开始执行

- swap函数执行完毕,swap函数和内部的变量一并释放销毁,

- i,j已经销毁,主函数的a,b 依然存在,最后一步打印的还是之前的a,b

- swap函数交换的是这个函数内部的变量,并没有影响主函数的a,b!!!

使用指针形参i 和 j

传值也必须对应的是变量的地址

对指针变量进行交换

- a  值5 地址1001 ,b 值10 地址1002

- 形参:指针变量 i 值收到 &a 1001,指针变量j 值收到 &b 1002 , 声明指针变量temp,

- 三者交换完毕 指针变量 i 值1002,指针变量j 值1001

- 但是a和b还是值5 地址1001 ,值10 地址1002

- 这个问题还是一样,内部的指针变量确实交换了,但是方法结束之后有影响到主函数的a,b了吗?并没有!!!

- 指针变量 i 和 j 收到 a 和 b 的地址

- 把 指针i 的地址反引用获取该值【地址值】存储的值,赋值给 变量temp,这个类型是int 类型,不是int指针类型!!!

- 把 指针j 的地址反引用获取该值【地址值】存储的值 ,赋值给 反引用的 i【*i】

- 把 temp 变量的值,赋值给 反引用的 j【*j】

- 我们这样就对主函数的a变量 和 b变量的值进行了交换

- a 变量的地址 给了指针 i ,i 可以通过*i 操作修改 a变量的值,

也就是说 *i 指向了变量a 的值,变量a可以操作这个值,*i也可以操作

* 的用法:

- 单作操作符,用于相乘运算符

- 定义指针变量  int * p 定义了一个int指针类型变量,标识符是p,p只能存放int类型变量的地址,

- 指向运算符,*p指向了该地址存储的值

#include <stdio.h>

void swap(int * i,int * j){
int temp = *i;
*i = *j;
*j = temp;
} int main() {
int a = 5;
int b = 10;
printf("a = %d, b = %d \n",a,b);
swap( &a, &b );
printf("a = %d, b = %d \n",a,b);
return 0;
}

《郝斌C语言 自学》 P127 - P129

https://www.bilibili.com/video/BV1os411h77o

【郝斌C ST】指针 swap问题的更多相关文章

  1. 郝斌老师C语言学习笔记(一)

    在给变量分配内存时,很可能这段内存存在以前其他程序使用留下的值.当使用VC编译器,若编译器发现没有给变量赋值而使用,就会返回一个以“85”开头的很大的数字(此时该段内存中为一个垃圾数,为了避免出现较常 ...

  2. [C]郝斌C语言课程大纲及笔记

    本笔记整理于郝斌老师C语言课程,做学习参考之用. 1.[编程笔记]第一章 C语言概述 2.[编程笔记]第二章 C语言预备知识 3.[编程笔记]第三章 运算符与表达式 4.[编程笔记]第四章 流程控制 ...

  3. 郝斌老师的SQL教程

    时隔两年,重拾数据库编程.郝斌老师的sql教程通俗易懂,用作复习简直不能太赞.

  4. 郝斌–SQL Server2005学习笔记

    数据库(Database)狭义上是指存储数据的仓库,广义上包含对数据进行存储和管理的软件(DBMS)和数据本身.数据库由表.关系和操作组成. 一.数据库简介 1.为什么需要数据库 数据库简化了对数据的 ...

  5. 郝斌C语言代码

    #include<stdio.h> int main() { ; printf("%#x\n",a); ; } /* output 0xf; */ //(15)10= ...

  6. 郝斌 SqlServer2005 学习笔记

    1.0 什么是数据库 狭义:存储数据的仓库. 广义:可以对数据进行存储和管理的软件以及数据本身统称为数据库. 另外一种说法:数据库是由表.关系.操作组成. 2.0 为什么要学习数据库 几乎所有的应用软 ...

  7. C语言-郝斌笔记-007是否为素数

    是否为素数 # include <stdio.h> bool IsPrime(int val) { int i; ; i<val; ++i) { ) break; } if (i = ...

  8. C语言-郝斌笔记-006排序及查找

    1. int partion(int *a, int low, int high) { int value = a[low]; int t; while (low < high) { while ...

  9. C语言-郝斌笔记-005菲波拉契序列

    菲波拉契序列 /* 菲波拉契序列 1 2 3 5 8 13 21 34 */ # include <stdio.h> int main(void) { int n; int f1, f2, ...

  10. C语言-郝斌笔记-004判断是否为回文数

    判断是否为回文数 # include <stdio.h> int main(void) { int val; //存放待判断的数字 int m; ; printf("请输入您需要 ...

随机推荐

  1. [SWPUCTF 2021 新生赛]gift_F12

    首先我们打开环境会发现花里胡哨的,而题目中有提示:F12,所以我们直接F12查看源码 然后ctrl+f信息检索flag.直接找到flag提交 但要注意提交格式为NSSCTF{}

  2. redis zset 延迟合并任务处理

    redis zset 延迟合并任务处理 @Autowired public RedisTemplate redisTemplate; ##1.发送端:在接口中收集任务ID,累计时间段之后,合并处理. ...

  3. Lru-k在Rust中的实现及源码解析

    LRU-K 是一种缓存淘汰算法,旨在改进传统的LRU(Least Recently Used,最近最少使用)算法的性能.将其中高频的数据达到K次访问移入到另一个队列进行保护. 算法思想 LRU-K中的 ...

  4. shell 根据 指定列 进行 去除 重复行

    根据指定列进行去除重复行 这里的重复是指如果两行的某一列数据相同,则认为是重复数据. 例如:第1行与第2行数据,其中的第2列(以- 作为分隔符)明显是重复的. 100069 - ARM Compile ...

  5. 全志T113-i+玄铁HiFi4开发板硬件说明书(2)

    前 言 本文档主要介绍开发板硬件接口资源以及设计注意事项等内容,测试板卡为全志T113-i+玄铁HiFi4开发板,由于篇幅问题,本篇文章共分为上下两集,点击账户可查看更多内容详情,开发问题欢迎留言,感 ...

  6. 使用定时器:在logs目录,每两分钟产生一个文件

    1.使用定时器:在logs目录,每两分钟产生一个文件(文件格式为:201711151323.log.201711151323.log.2017111513xx.log ...思路:定时器定时调用she ...

  7. Java项目静态资源映射的几种方式

    一.Springboot 1.webjars方式 我们之前使用Maven构建一个Web项目时,在main目录下会存在一个webapp的目录,我们以前都是将所有的页面或静态资源导在这个目录下,但现在使用 ...

  8. Mybatis-plus 中Wrapper的使用

    mybatis plus条件构造器关系图 1.上图绿色框为抽象类abstract 2.蓝色框为正常class类,可new对象 3.黄色箭头指向为父子类关系,箭头指向为父类 QueryWrapper 继 ...

  9. Mybatis 总结ResultMap的复杂对象查询

    association:映射的是一个POJO类,处理一对一的关联关系 collection:映射的一个集合列表,处理的是一对多的关联关系 模版 <!--column不做限制,可以为任意表的字段, ...

  10. python执行shell并获取结果

    在Python中执行Shell命令并获取其结果,通常可以使用subprocess模块.这个模块允许我们启动新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回码.下面是一个详细的示例,展示了如 ...