因为指针通过地址传递参数,如果不用指针传送速度慢。
创新互联建站是一家专业提供爱民企业网站建设,专注与成都网站制作、成都网站建设、html5、小程序制作等业务。10年已为爱民众多企业、政府机构等服务。创新互联专业网站建设公司优惠进行中。
在没有C++语言的年代,没有面向对象、模板的语法支持,struct中还不能定义函数,用C语言想要对业务功能(算法,此处即指函数)进行抽象,不想依赖具体的数据结构/数据类型,此时就必须用指向函数的指针来实现抽象与具体的分离,
该函数的入参可以是void*,这样调用者就可以传入任意类型的参数了。后来有了C++,就用类成员函数和泛型(模板+functor)来代替了,这样做有更强的静态类型检查机制和编程约束,有利于减少滥用风险。
函数指针的一个典型应用场合是实现回调,因为此时还不知道具体函数定义,事件发生时才调用、才确定;类比于面向对象中的“多态”+设计模式中的“观察者模式”,回调的实质仍然是抽象。
扩展资料
C语言程序开发中,数组指针是有其独特的作用的,它可以用于限制函数接收指针索引的内存长度,利用编译器规范程序项目。在定义数组指针时,利用C语言的typedef关键字常常能够使代码更加易读:
typedef int Vector3d[3];
void transform(Vector3d *vector);
/* equivalent to `void transform(int (*vector)[3])` */
...
Vector3d vec;
...
transform(vec);
参考资料来源:百度百科—指针
选D
因为第一个
参数
是地址传递,fun(b,a);中传入a
字符
。*c=*c+1将c的值变为b字符。
主函数
的值改变。
第二个参数是值传递,所以在
函数
中d的值为B字符。但是并不影响主函数的值,所以主函数输出a的值是A。b的值是b。
运用代码解释指针运用的理解如下:
#includeiostream
using namespace std;
int fun1 (int a,int b)
{
int c;
c=a;a=b;b=c;
cout"a1:"a";b1:"bendl;
}
int fun2 (int *a,int *b)
{
int *c;
c=a;a=b;b=c;
cout"a2:"*a";b2:"*bendl;
}
int fun3(int *a,int *b)
{
int *c;
c=*a;*a=*b;*b=c;
cout"a3:"*a";b3:"*bendl;
}
int fun4 (int *a,int *b)
{
int c;
c=*a;*a=*b;*b=c;
cout"a4:"*a";b4:"*bendl;
}
int fun5 (int a,int b)
{
int c;
c=a;a=b;b=c;
cout"a5:"a";b5:"bendl;
}
int main()
{
int aa=1,bb=2;
fun1(aa,bb);
cout"aa1:"aa";bb1:"bbendl;
fun2(aa,bb);
cout"aa2:"aa";bb2:"bbendl;
fun3(aa,bb);
cout"aa3:"aa";bb3:"bbendl;
fun4(aa,bb);
cout"aa4:"aa";bb4:"bbendl;
aa=1,bb=2;
fun5(aa,bb);
cout"aa5:"aa";bb5:"bbendl;
return 0;
}
输出结果为:
a1:2;b1:1
aa1:1;bb1:2
a2:2;b2:1
aa2:1;bb2:2
aa3:1;bb3:2
a4:2;b4:1
aa4:2;bb4:1
a5:2;b5:1
aa5:2;bb5:1
main中调用fun1()时,将实参a,b的值传递给了交换函数,如果此时在swap1中打印,可以看到结果是正确的,但是该过程其实是将aa和bb分别复制了一份给了函数,执行完fun1()之后,aa和bb的值没有任何变化。
fun2(),看似的确使用了指针,但还是失败,因为这里是将aa和bb的地址给交换了,而并没有交换aa和bb的值。在这里由于未给c赋值,c中并没有确定的值,c中的值是不可预见的。此时c可能指向一个未知的存储单元。
而严重的情况是,该单元的数据可能是有用的,因此fun2()不但没有实现两个数的交换,反而给系统的稳定性带来威胁。
fun3(),将int赋值给int *,编译错误。
fun4()是正确的。为了在函数中改变了的变量能被其它函数调用,正确的办法是用指针变量作为函数参数,在函数执行过程中使指针变量所指向的变量值发生变化。
函数调用结束后,哲别变量值的变化依然保留下来,这样就实现了通过函数调用是变量的值发生变化,在其它函数中可以使用这些改变了的值的目的。
fun5()也是正确的,这是引用的重要应用之一。对于引用的操作实际上是作用在引用所因的对象上。
扩展资料
在函数中的参数,并不是调用者的变量,而是临时申请的变量a和b存放main函数中变量a和b的值,并在函数中用来计算,在fun中给a和b赋值都是在操作这两个临时申请的变量,函数返回后,这两个变量被舍弃,函数调用也没有将这两个临时变量的值返回给main函数中调用使用的参数功能。
所以,在函数中要操作调用者申请的变量,需要给出它们的指针,函数中用指针来找到这些变量的位置和内容。
你上面那一段话,对于初学者来说确实坑爹,说的像什么官方话语,我看着也就只能理解个模糊大概。
先给你举个例子吧,函数指针的写法
int
*p;
int
a;
p=a;
//这是一般整型指针
#include
iostream
using
namespace
std;
int
arr(int
a,int
b){return
0;}//比如说是函数1
int
brr(int
a,int
b){return
1;}//比如说是函数2
int
main()
{
int
(*frr)(int,int);
//这里就是函数指针
frr
=arr;
//它可以指向arr
coutfrr(1,2)endl;
frr=brr;//也可以指向brr,只需要改改指向的对象,就可以操作不同的函数
coutfrr(1,2)endl;
return
0;
}
比如函数需要一个整型数组:
void ex(int a[])
{
}
或者可以写成:
void ex(int *a)
{
}
效果是一样的。
使用的时候:
引用数组中的第2个元素(即下标为1的元素)
a[1]
或者*(a+1)
基本上与数组的正常使用没有区别。
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。