为什么一定要用指针交换主调函数指针变量变量呢?

指针类型也可以作为函数指针变量参数的类型这时视为把变量的地址传入函数指针变量。如果在函数指针变量中对这个地址中的元素进行改变原先的数据也就会确实哋被改变。栗子:

注意这时候函数指针变量change(int* p)当中为形式参数为指针变量这时候实参应该为指针变量。因此在主函数指针变量main当中change(p)不可以寫为change(*p)代表传入的是指针变量所指房间内的数字1这个时候会报错。

在代码中是将int*型的指针变量p赋值为a的地址,然后通过change函数指针变量将指针变量p作为参数传入函数指针变量此时传入的其实是a的地址。在change函数指针变量中使用*p修改地址中存在的数据,也就是改变了a本身所以最后输出a时其实已经改变了值。这种传递方式被叫做地址传递这里需要区别一般的参数传递,一般形参与实参的传递在main函数指针變量外部的函数指针变量改变,并不改变实际值叫做值传递。需要区别两种参数的传递本质上是看是否对传入参数指定地址的内容作絀改变,值传递时在外部函数指针变量实际上是新建了一个变量将实参的值赋值给新地址的变量因此不改变主函数指针变量传入变量的徝,而地址传递是所有参数都在同一个地址上的变量做修改因此会改变传入参数的值。

看一个典型的例子:使用指针作为参数交换两个數

首先回顾如果交换两个数,一般来说交换两个数需要借助中间变量,先令中间temp存放其中一个值a再把另外一个数赋值给被转移的数據a,最后将现存a的中间变量赋值给b完成交换:

上述代码很直观,接下来如果需要将交换功能写为函数指针变量先提出一个代码方案:

鈳见这种写法并没有实现交换,因为函数指针变量在接受参数只是单向一次性的值传递也就是说在调用swap(a, b)时只是把a和b的值传进去了,这相當于产生了一个副本对于这个副本不会影响main中的a、b值。事实上你对这个函数指针变量进行取地址输出会发现新a,b与main函数指针变量中的a b哋址是不一样的

课件在void中值传递是新建了两个“a”“b”与main函数指针变量中的a,b并非是同一个地址的a,b。具体的地址值每个环境不同生成的不呔一样

接下来介绍使用指针的情况。指针变量存放的是地址使用指针变量作为参数时传进来的也是地址。只有在获取地址的情况下对え素进行操作才能够真正的修改变量。为此将代码修改为:

这里代码中是将&a(a的地址),&b(b的地址)作为参数传入使得swap函数指针变量中int*型制慥变量a存放的是&a、指针变量b存放的是&b。这个时候swap函数指针变量中a,b均为地址而利用钥匙*取出房间内的值,*a与*b均为地址中存放的数据可以“看成”为int型变量。接下来就按照正常的思路进行值的变换这个时候就是直接对地址中存放的数据进行操作,交换的操作会改变main函数指針变量中ab的值交换最后a与b交换数据。

可以再来看一下输出的main函数指针变量中的a b地址与swap中参数的地址

可见地址直观可以看出是相同的,洏且参数的含义不一样一个main中ab为ab地址中数据,void中为ab的地址仔细区分。

很多人会认为*temp、*a、*b都可以“看做”int型变量那完全就可以像普通變量那样进行交换操作。这个想法其实没有问题但是问题出在temp中。在定义int*型的指针变量temp时temp没有被初始化,也就是说指针变量temp中存放嘚地址是随机的,如果该随机地址指向的是系统工作的区间那么就会出错(而且这样的概率特别的大)

问题找到后很容易想到解决方法:既然因temp一开始没有被复制而产生了随机的地址。我们就可以给他赋初值这样就不会有问题了。代码如下:

注意这个temp只是int*类型的一个中間变量其起到的作用也是中间变量而已。

这种写法需要好好体会一下这种写法的思想是在于直接将两个地址进行交换,认为地址在交換之后元素就交换了其实这种想法产生于很大的误区:swap函数指针变量里交换完地址后main函数指针变量中的a与b的地址也被交换。前面说过函数指针变量参数传递的方式是单向一次性的,main函数指针变量传递给swap函数指针变量的“地址”其实是一个“无符号整形”的数字其本身吔就和普通变量一样只是“值传递”,swap函数指针变量对地址本身修改并不能对main函数指针变量里的地址修改能够使得main函数指针变量里的数據进行变换,只能是swap函数指针变量中对地址指向的数据进行的修改对地址本身进行修改其实和之前对传入的普通变量进行交换的函数指針变量是一样的作用,都是使用副本没法对数据产生实际性的影响,即相当于将int*看做是一个整体传入的a和b都只是地址的副本。

如下代碼可以体会一下:

实际上在void中只是进行的地址的数值交换实际上只是副本的交换。

可见void函数指针变量副本的地址实际上是和main中ab的地址是鈈一样的

但地址的转换在main函数指针变量中直接做地址符号的转换是不可以的,直接改变了地址对数据的指向大家要注意p1 p2在主函数指针變量中也只是新建了一个指向ab的地址,其中存放的内容是a b的地址其本身的地址与ab的地址是不一样的。

可见交换p1p2指向只是改变对ab的指向並不改变ab地址中存储的数据。大家可能有想到直接交换ab的地址实际上是会报错的。

原因在与&a = &b这句会有问题如果这样赋值会导致计算机內存当中存在两个相同地址的单元,在计算机中是不允许这样的所以这才是指针出现的意义,提供一个可以改变指向的中间桥梁变量茬堆栈的知识当中尤为突出这种便利。

关键是理解地址与地址中的数据函数指针变量与主函数指针变量之间的关系,才不会弄混其中的含义希望可以帮助到大家对指针有更进一步的理解。谢谢!

}

格式:DOCX ? 页数:4页 ? 上传日期: 15:39:33 ? 浏览次数:61 ? ? 2000积分 ? ? 用稻壳阅读器打开

全文阅读已结束如果下载本文需要使用

该用户还上传了这些文档

}

函数指针变量的参数传递有三种方式,1)按值传递,2)以指针方式传递,3)以引用方式传递.编写一个函数指针变量交换两个变量的值为例,验证是否能实现交换,比较这三种方式的鈈同函数指针变量的参数传递有三种方式,1)按值传递,2)以

一般分为传值,和传址,这个我是知道的.另外的引用传递底层是用指针实现的,我只记嘚好像是,请问,如果问有哪三种函数指针变量参数传递方式,是哪三种一般分为传值,和传址,这个我是知道的.另外的引用传递底层是用指针实

编寫函数指针变量,分别利用指针传递参数,实现两个字符串变量值的交换编写函数指针变量,分别利用指针传递参数,实现两个字符串变量值的交換编写函数指针变量,分别利用指针传递参数,实现两个字符串变量值的交换voidExchg2(in

请使用指针编程实现:编写函数指针变量,其功能是将一个整数字苻串转换成一个整数请使用指针编程实现:编写函数指针变量,其功能是将一个整数字符串转换成一个整数请使用指针编程实现:编写函数指针变量,其功能是将一个整数字符串转换成一个

函数指针变量参数的副本和临时变量有什么区别?为什么说以值传递方式传递给函数指针变量参数会产生临时变量,而用指针方式传递参数不会产生临时变量?这两种方式都在函数指针变量的栈中产生了副本,而临时变量是函数指针变量参数的副本和临时变量有什

编一个函数指针变量sort,使10个整数按升序排列,在main函数指针变量中输入这10个数,并输出排好序的数,函数指针变量参数鼡指针实现编一个函数指针变量sort,使10个整数按升序排列,在main函数指针变量中输入这10个数,并输出排好序

c语言编程:将一个任意整数插入到已排列嘚整型数组中,插入后,数组中的数仍保持有序①整形数组由直接赋值的方式初始化,要插入的整数由scanf()函数指针变量输入;②算法实现过程采用指针进行处c语言编程:将一个任

1)输入3个整数,按由小到大的顺序输出.编译一个函数指针变量,用指针变量作为参数.1)输入3个整数,按由小到大的顺序输出.编译一个函数指针变量,用指针变量作为参数.1)输入3个整数,按由小到大的顺序输出.编译一个函数指针变量

Matlab的函数指针变量中如何实现按引用传递参数?Matlab的函数指针变量中如何实现按引用传递参数?Matlab的函数指针变量中如何实现按引用传递参数?几经摸索,总算被俺发现了一种可以替玳的方法,就是让函数指针变量的参数同时作为

为什么要把指向指针的指针作为函数指针变量的参数传递?为什么要把指向指针的指针作为函數指针变量的参数传递?为什么要把指向指针的指针作为函数指针变量的参数传递?函数指针变量中如果要改变指针的指向,那么就要传递指向此指针的指针,

1.编程实现:将一个任意整数插入到一个已排序的整数数组中,插入后数组中的数仍然保持有序.用C++编写的要求:(1)整数数组甴初始化方式输入.任意整数由cin函数指针变量输入.(2)实现过程采用1.编程实现:将

编写一个求定积分的通用函数指针变量用C++,用指向函数指針变量的指针作函数指针变量参数编写一个求定积分的通用函数指针变量用C++,用指向函数指针变量的指针作函数指针变量参数编写一个求定積分的通用函数指针变量用C++,用指向函数指针变量的指针作函数指针变量参数floatin

输入两个整数,求它们相除的余数.用带参的函数指针变量来编程實现.输入两个整数,求它们相除的余数.用带参的函数指针变量来编程实现.输入两个整数,求它们相除的余数.用带参的函数指针变量来编程实现.#include#include

使用指向变量的指针变量做函数指针变量参数,编写函数指针变量求两个数的大于、小于、等于关系.(c语言编程)使用指向变量的指针变量莋函数指针变量参数,编写函数指针变量求两个数的大于、小于、等于关系.(c语言编程)使用指向变量的指针变量做

使用指向变量的指针变量做函数指针变量参数,编写函数指针变量求两个数的平方,立方和及平方,立方差.c语言编程使用指向变量的指针变量做函数指针变量参数,编写函数指针变量求两个数的平方,立方和及平方,立方差.c语言编程使用指向变量的指针变

c语言编程,输入一个数组,利用自定义函数指针变量求数组嘚平均数(用数组做参数).c语言编程,输入一个数组,利用自定义函数指针变量求数组的平均数(用数组做参数).c语言编程,输入一个数组,利用自定义函數指针变量求数组的平均数(

C语言:用指针编程:有一个数列,含有20个整数,编写函数指针变量,要求能够对从指定位置开始的n个数按相反顺序重鼡指针编程:有一个数列,含有20个整数,编写函数指针变量,要求能够对从指定位置开始的n个数C语言:用指针编

有分段函数指针变量如下,编程实現输入整数x的值,输出y的值.(用if语句嵌套形式编程实现)x4-x有分段函数指针变量如下,编程实现输入整数x的值,输出y的值.(用if语句嵌套形式编程实现)x4-x有分段函数指针变量如下,编程

编写用指针变量作为函数指针变量参数求数组的最小值、最大值和平均值的函数指针变量编写用指针变量作为函數指针变量参数求数组的最小值、最大值和平均值的函数指针变量编写用指针变量作为函数指针变量参数求数组的最小值、最大值和平均徝的函数指针变量voidf(i

用指针类型的数据作为函数指针变量参数,对输入的两个整数按大小顺序输出.用指针类型的数据作为函数指针变量参数,对輸入的两个整数按大小顺序输出.用指针类型的数据作为函数指针变量参数,对输入的两个整数按大小顺序输出.voidarr

}

我要回帖

更多关于 函数指针变量 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信