由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;就可以使用了。

原文地址:https://www.cnblogs.com/qiaoyanlin/p/11994476.html

时间: 2024-10-29 03:30:52

由swap引出的局部变量,形参和指针的小问题的相关文章

引用,引用形参,指针形参与指向指针的引用形参,内存泄露及free相关

由做UVa133引发的一系列问题及讨论 1.引用类型    C++ Primer P51 引用就是对象的另一个名字,使用多个变量名指向同一地址.实际程序中,引用主要用作函数形参. 复合类型.不能定义引用类型的引用,但可以定义任何其他类型的引用. 格式: 类型名&  标示符=已声明的常变量; 2.引用形参    C++ Primer P201-205 非引用形参有普通的.指针形参.const形参(可传const对象或非const对象) 引用形参,3种情形:@修改实参,或返回多个值  @避免复制大型

C专家编程之为什么C语言把数组形参当做指针:数组/指针实参

#include<stdio.h> void print_array_test(char ca[]) { printf("ca : %s\n",ca); printf("&ca : %s\n",&ca); printf("&(ca[0]) : %s\n",&(ca[0])); printf("&(ca[1]) : %s\n",&(ca[1])); printf(&qu

C++ 指针的小知识

看个小例子: char* fun1(){ char * p = (char*)malloc(100); p = "helloww"; return p;} void fun2(char *p){ p = "hello";} fun1 完成了指针的赋值和返回指针区域.    fun2 因为p的局部赋值而无法再函数跳出后带值. C++ 指针的小知识

记C函数指针的“小坑”

今天遇到一个C函数指针的小坑,索性记下来. 我在a.c 文件里面,引用b.c 文件的函数声明作为指针引用 比如在a.c生命一个函数指针 typedef void (*free)(void *val) fun b.c中的有一个函数 void char_free(void* val){ if (val) LIST_FREE(val); } 但是当我编译的时候 编译器报错:‘char_free’ undeclared 我就纳闷了,一般情况下,在同一可执行程序的源文件中,只要函数不声明为static,其

从花式swap引出的pointer aliasing问题

上次,一个同学问我,你知不知道可以不用引入中间变量就可以实现swap? 我说,我知道,可以用加减法或者异或实现,像是这样 void mySwap(int &x,int &y) { x=x+y; y=x-y; x=x-y; } 或者这样 void mySwap(int &x,int &y) { x=x^y; y=x^y; x=x^y; } 但这种花式swap没什么意义,而且具有风险,那就是如果参数引用的是同一个变量,将产生错误的结果0. 这种问题叫pointer aliasi

函数形参为指针与非指针的区别

@2018-5-17 13:38:58 函数的形参定义为非指针 形参是实参的一份拷贝,在函数执行期间,实参的改变都不会反映至函数的执行结果 函数的形参定义为指针 形参是实参地址的指针,在函数执行期间,实参的改变都会反映至函数的执行结果 以上特性更明显的反应在形参为一数据结构而非单变量,形参为一数据结构,在执行函数操作了其中一部分数据时,实参数据结构发生了改变,非指针形参函数执行结果无变化,指针形参函数操作的数据结构其实是前后两次数据的混合 原文地址:https://www.cnblogs.com

黑马程序员-关于C语言的指针一些小知识点

------- IOS培训.android培训.java培训.期待与您交流! ---------- c语言的难点和精华部分就是指针,能够将指针完全理解并且将其运用熟练不是一件容易的事情,其中有几个知识点比较绕一些. 1.数组指针与指针数组的区别.  数组指针是一个指针,是指向数组的指针,就如同int*,char*型指针,只不过它是指向数组的(首元素),大小为4(32位平台下),通过它就可以做找到整个数组. 1 #include <stdio.h> 2 int main(int argc, ch

C-Xcode真随机数的产生, 指针基础, 小技巧

小技巧1: 输出一个 % 输出一个%号(因为%是格式控制符的符号,所以输出是单独写一个%,系统会默认把%与其后面一个字符相结合当做格式控制符) —— %% 小技巧2: 自动整理代码 整理代码组合键 选中要对齐的代码 control + i 就会自动对齐 前提:代码没有语法错误 小技巧3: 产生一个真随机数 产生一个指定范围内的随机数: 比如需求:产生10-20的随机数 int num = arc4random_uniform(11) + 10 其他类推可得 公式 int num = arc4ra

指针拷贝小例子

*(*ppTable) = m_pConfig->m_Userdat.m_Table; 这句会有拷贝么?m_Table 是成员变量 答案:会 原因解析: *ppTable是和mTable类型一样的一个指针 所以如果把mTable的类型记做A 那么 你这句话就相当于 *(a) = b; 其中a是A* 类型 b是A类型的一个实例对象 *(a) = b;执行A类的*operater=函数 执行复制逻辑 如果你写成a = &b 那么这个时候a指向b的地址 b的内容修改a就修改 版权声明:本文为博主原