由swap引出的局部变量,形参和指针的小问题
1.第一种实现swap函数的方法是:
swap(int a,int b)
{
Int c = a;a = b;b =c;
}
这表面一看确实是实现了整数a,b的交换,当拿来用时发现,结果并不是我们想要的。分析一下原因:在main中int x=1,y=2;然后调用swap(x,y);这相当于int a = x ; int b = y;这样完成了赋值操作(对形参赋值),在swap函数内部对a和b的替换和main中的x,y没有任何关系了,所以当然不能完成x,y的互换了。
2.现在呢,来看一下第二种实现swap函数的方法:
Swap(int *a,int *b)
{
int *c = a ; a = b ; b = c;
}
在表面看一下,很显然完成了互换啊!实际上并不是这样滴,分析:在main中int x=1,y=2;然后调用swap(&x,&y);这相当于int *a= &x,int *b = &y;用x,y的地址实例swap函数的形参。在swap函数中对a和b指针值进行交换,只是a和b指向的地址发生了改变。并不影响main中的x和y的地址变化。所以……
3.可以看看第三种实现swap函数的方法了:
Swap(int *a,int *b)
{
int c = *a ; *a = *b ; *b = c;
}
这次能不能实现呢??别不敢说,我没有那么变态,这次当然可以实现了。这个和上一个不一样在是什么地方呢?这次是直接改变的指针指向的地址空间的值,地址空间是x和y的地址空间,这样当然能完成x和y的互换了。
注:用引用也是可以实现swap函数的,这里就不在说了,很简单的东西!l另外实现swap功能的函数写法是有很多的,这里不一一列举了,感兴趣可以自己琢磨琢磨哦。另外STL中也实现了swap函数,只要#include<algorithm>using namespace std;就可以使用了。
由swap引出的局部变量,形参和指针的小问题的更多相关文章
- 记C函数指针的“小坑”
今天遇到一个C函数指针的小坑,索性记下来. 我在a.c 文件里面,引用b.c 文件的函数声明作为指针引用 比如在a.c生命一个函数指针 typedef void (*free)(void *val) ...
- 从花式swap引出的pointer aliasing问题
上次,一个同学问我,你知不知道可以不用引入中间变量就可以实现swap? 我说,我知道,可以用加减法或者异或实现,像是这样 void mySwap(int &x,int &y) { x= ...
- C语言中的地址传递(传指针,传递给形参的指针仍然是实参指针的一份拷贝)
先看一个例子:这个程序为什么会崩溃? #include <stdio.h> #include <stdlib.h> int f(int *q) { ; q = (int*)ma ...
- C++中函数的形参为数组时,实质形参是指针
C++中函数的形参如果为数组的话,那么进行实参传递时,实参实际上换转化成指针.参考下面的例子: #include<iostream> using namespace std; void f ...
- C++ 指针形参和指针引用形参的原理分析
C++ 函数的参数传递可以分为:值传递和引用传递. 两者的最大区别也很简单,如果该函数的参数只是读的话,值传递就可以满足.如果该函数的参数需要进行修改并返回的时候,就应该进行引用传递. C++指针作为 ...
- 【链表】Swap Nodes in Pairs(三指针)
题目: Given a linked list, swap every two adjacent nodes and return its head. For example,Given 1-> ...
- C++函数形参为指针和指针引用的区别
区别: 1.指针传参被调用函数的指针变量在栈内存中重新申请内存. 2.指针引用传参被调用函数的指针变量与调用函数的指针变量共用一块空间. // PointerCite.cpp : 定义控制台应用程序的 ...
- C++ 指针的小知识
看个小例子: char* fun1(){ char * p = (char*)malloc(100); p = "helloww"; return p;} void fun2(ch ...
- C语言中的指针的小标可以是负数
首先,创建一个正常的数组 int A[20];.然后用指针指向其中间的元素 int *A2 = &(A[10]); 这样,A2[-10 ... 9] 就是一个可用的有效范围了. 1 2 3 4 ...
随机推荐
- 浅谈Python设计模式 - 享元模式
声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 享元模式: 享元模式是一种用于解决资源和性能压力时会使用到的设计模式,它的核心思 ...
- mysql设计规范和原则
DB设计流程: 1,需求分析 2,ER设计 3,物理设计 需求分析的最佳实践是头脑风暴,把需求理解透彻.根据公司的现况和未来的发展,与pm一起来讨论. ER(EntiyRelation)设计阶段要确定 ...
- ANDROID - 打包和引用本地的AAR
打包方法: 打开Gradle面板 Gradle Projects: 选择Library对应的Gradle Task,比如:":testsdk": 依次 Tasks > ...
- 2019年杭电多校第一场 1004题Vacation(HDU6581+数学)
题目链接 传送门 题意 有\(n+1\)辆车要过红绿灯,告诉你车的长度.与红绿灯的起点(题目假设红绿灯始终为绿).车的最大速度,问你第\(0\)辆车(距离最远)车头到达红绿灯起点的时间是多少(每辆车最 ...
- js动画--缓冲动画
前面讲述的动画速度都是匀速的,现实生活中的运动速度的变化不一定是恒定的,存在一定的缓冲,就像火车进站一样,速度会越来越慢. 对于改变速度措施,其实只要将动画第一课的程序稍微的改变一下就可以了,我们来看 ...
- 项目Beta冲刺(团队)——05.28(6/7)
项目Beta冲刺(团队)--05.28(6/7) 格式描述 课程名称:软件工程1916|W(福州大学) 作业要求:项目Beta冲刺(团队) 团队名称:为了交项目干杯 作业目标:记录Beta敏捷冲刺第6 ...
- mysql,本地连接看到的数据库不全,远程连接看到的数据库是完整的
xshell本地连接数据库,show databases; 下面只显示了两个数据库,mysql数据库看不到,问题原因是:用户没有权限 navicat远程连接,比上面看到的数据库多了很多,能看到mysq ...
- loadrunner:传json
loadrunner传k-v,用web_custom_request函数. init里面执行登录,根据返回获取到tokenId,action中,执行登录后的操作. 详细脚本如下: vuser_init ...
- centos7离线部署Patroni
实验环境Centos7.7.1908 x86_64 这里说明下为什么需要安装gcc readline-devel zlib-devel这三个包,因为编译安装postgres需要用到 一.首先安装gcc ...
- mySql 常用命令 | 珠峰培训例子
show databases; use mhxy; select database(); show tables; desc account_list_175; ),(); select from_u ...