在c语言中,指针作为函数参数,形参只能传递值 , 而不能传递地址,是怎么回事?C语言中,函数参数只能传值 。与传值对应的是传引用,C语言不支持函数参数传引用,C++语言才支持 。
C++传引用函数:
void foo(int a) { a = 3; }
假如a = 2,执行foo(a)后 , a = 3 。
---
C语言可以模拟传引用,方法是通过指针来实现:
void foo2(int* ap) { *ap = 3; }
假如a = 2,执行foo2(a)后 , a = 3
foo2(a)调用本质上仍然是传值,只不过传递的是指针,指针即是地址,地址本质上是一个无符号整数 。
如果:
void foo3(int b) { b = 3; }
假如a = 2,执行foo3(a)后,a = 2 。这是因为foo3(a)调用过程中,a值传给形参b,修改b的值与实参a无关 。
注意到,foo3(a)与上述foo(a)传引用的调用是形式一样的 。
既然C语言通过指针可以实现传引用调用 , 为什么C++还要引入引用这个特性呢?这是因为C++引入的很多新特性需借助引用来实现,比如 , 拷贝构造函数等等 。
c语言中用一个函数指针作为另一个函数的参数,该怎么解决首先需要声明函数指针c语言函数指针形参的类型(下例子中c语言函数指针形参的typedef int (*fpFunt)(int a,int b)c语言函数指针形参,再定义某个函数(下例中的Add)c语言函数指针形参,在其参数列表中使用该函数指针类型,同时需要定义另一函数(下例中的fpAdd,注意该函数形式要和fpFunt一致 , 本例子中是返回一个整数,两个整型参数)作为实参用 。这里在手机上使用易历知食软件内的微C程序设计来编程,举个两个数相加的例子,代码如下图c语言函数指针形参:
调用后运行结果如下图:
c语言函数的形参为指针变量时,对应的实参可以是数组名 。怎么理解呀举例:
void f(int *p)
{
}
int arr[]={1,2,3};
因为函数f的形参是一个类型为int的指针变量,所以调用f时,可以将数组名arr作为实参传给形参p 。即可以这样调用:f(arr);
关于C语言结构体指针做函数形参的问题fun函数c语言函数指针形参的第二个参数之所以用指针c语言函数指针形参 , 就是为了能把函数里面对这个参数做的改动保存下来
而c语言函数指针形参你如果把*s=a[p];改成s=a[p];效果相当于c语言函数指针形参,改了s的值c语言函数指针形参,使其不再指向参数(函数
外部变量
m)的地址,虽然*s的值是正确的 , 但实际m的值则没有改变,所以在外面输出的时候,结果和预期不一致了
s=a[p];这个操作本身没有问题
C语言-函数指针/*
函数指针,关键是后面两个字“指针”,顾名思义,是一个指向函数的指针
原理:函数在创建好了后,函数的代码会在内存中占有个位置,这时我们创造一个指针来指向这个地址,这个指针就叫函数指针
函数指针不可以移动,想要移动指针的位置来指向函数的下一个指令的想法是错误的
函数指针的要求,
1,首先这个指针 , 要和函数的返回类型一样
2,指针的*和名字 , 要用小括号括起来//不括起来就是指针函数了,意思就变成,函数返回一个指针了
3,最右边的小括号里形参位置的类型,形参的个数,也要和函数定义时的形参一致 , 只要类型,不要形参名即可,
但是加上形参名也可以,没毛病,看上去也更清晰
*/
#include
void swapchar(char *a, char *b)
{
char t;
t = *a;
*a = *b;
*b = t;
}
void swapchar2(char * a2, char * b2)
推荐阅读
- 冒险王ol游戏素材包,冒险王ol单机版
- 公众号微信支付在哪里开通,公众号微信支付功能怎么开通
- 电信服务器拆解,服务器 拆卸
- 抖音怎么直播能带货,抖音怎么直播能带货赚钱
- java数字倒三角形代码 java输出倒三角*号代码解析
- 模拟经营游戏捞鱼,有什么模拟经营游戏好玩
- linux命令怎么办 linux命令l
- js发送请求获取服务器时间,js发送请求获取服务器时间和地址
- 王小云讲区块链,王小云视频