当前位置:首页 » 编程语言 » c语言将函数指针作为形参
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言将函数指针作为形参

发布时间: 2022-10-25 23:51:25

‘壹’ 关于c语言结构体指针做函数形参的问题

*s表示变量m本身,对*s的赋值就是对m赋值,所以*s=a[p]是正确的。

请注意,函数fun中的s变量是一个地址,只对该地址进行重新赋值,并不对其所指向的变量m造成影响。所以s=&a[p]不改变main函数中m变量的值。

如果把*s=a[p]改为s=&a[p],输出会是乱码。这具有很大的迷惑性,使人以为地址的赋值过程出现了问题。实际上,若把m改为全局变量(全局变量中字符串默认为空,int变量默认为0):

#include<stdio.h>
#include<string.h>
#defineN10
typedefstructss
{
charnum[10];
ints;
}STU;
voidfun(STUa[],STU*s)
{
intt,p=0;
t=a[0].s;
for(inti=1;i<N;i++)
{
if(t>a[i].s)
{
t=a[i].s;
p=i;
}
}
s=&a[p];//这里是错误的语句
}
STUm;
voidmain()
{
STUa[N]={
{"A01",81},{"A02",81},{"A03",81},{"A04",81},{"A05",81},
{"A06",81},{"A07",81},{"A08",61},{"A09",81},{"A010",81}
};
printf("theoriginaldatais: ");
for(inti=0;i<N;i++)
{
printf("NO=%sMARK=%d ",a[i].num,a[i].s);
}
fun(a,&m);
printf("thelowestis%swho'sscoreis%d ",m.num,m.s);
}

输出的将会是the lowest iswho's score is 0

这说明变量m的值并未改变过。

事实上,若非要使用&符号,正确的方法是使用“引用”:

#include<stdio.h>
#include<string.h>
#defineN10
typedefstructss
{
charnum[10];
ints;
}STU;
voidfun(STUa[],STU&s)
{
intt,p=0;
t=a[0].s;
for(inti=1;i<N;i++)
{
if(t>a[i].s)
{
t=a[i].s;
p=i;
}
}
s=a[p];
}
voidmain()
{
STUa[N]={
{"A01",81},{"A02",81},{"A03",81},{"A04",81},{"A05",81},
{"A06",81},{"A07",81},{"A08",61},{"A09",81},{"A010",81}
},m;
printf("theoriginaldatais: ");
for(inti=0;i<N;i++)
{
printf("NO=%sMARK=%d ",a[i].num,a[i].s);
}
fun(a,m);
printf("thelowestis%swho'sscoreis%d ",m.num,m.s);
}

这里&的意思是“引用”,你可以网络上搜索C++中&符号的两个意义。

‘贰’ 关于C语言结构体指针做函数形参的问题

fun函数的第二个参数之所以用指针,就是为了能把函数里面对这个参数做的改动保存下来
而你如果把*s=a[p];改成s=&a[p];效果相当于,改了s的值,使其不再指向参数(函数
外部变量
m)的地址,虽然*s的值是正确的,但实际m的值则没有改变,所以在外面输出的时候,结果和预期不一致了
s=&a[p];这个操作本身没有问题

‘叁’ C语言用指针作函数参数

选D
因为第一个
参数
是地址传递,fun(&b,a);中传入a
字符
。*c=*c+1将c的值变为b字符。
主函数
的值改变。
第二个参数是值传递,所以在
函数
中d的值为B字符。但是并不影响主函数的值,所以主函数输出a的值是A。b的值是b。

‘肆’ 指针做函数的形参求帮助C语言

如果想把在子函数中的数据操作变化反应到主函数中的相应变量上,则在主函数中一定要传递这个变量的地址,不要管这个变量是什么类型!!
struct BiTree*a; //这里定义一个变量a , 它的类型是个结构体指针
creatBiTree(&a); //这里是将a的地址传递到子函数中,这样,子函数中,通过对a变量的地址的操作,实现了a本身的值的变化!!

void creatBiTree(struct BiTree**root) //这里形参是**,是因为a是指针,a的地址还是个指针,因此要是二维指针类型,这是与a的类型相关的!

如果改成(struct BiTree *root) , 主函数中 creatBiTree(&a); //写成这样编译会报参数类型错误, creatBiTree(a); //则root在子函数中的变化,不能反应到a上!!root和a仅是在数值上相等的两个不同的数据!

‘伍’ 关于c语言 指针变量作为函数形参的问题

这里是指针变量,但是它指向的空间是被分配过的.你可以向里面写入或者读出.

‘陆’ 在c语言中,指针作为函数参数,形参只能传递值,而不能传递地址,是怎么回事

建议上代码
问题中说法本来就是错的
形参指的是你声明或者定义用的那个参数,本来也不是传值的
至于传值还是传地址,如果形参是指针p,那么传递过去的p值就是地址,同时也是自身的值,这个看具体使用情况
所以一句话,show me your code

‘柒’ c语言中指针作为形参,代码如下:

你要用*去解引用,这样才能改变指针指向内存的值。
你的swap函数写的有问题,正确的写法有人给了。
至于为什么*x,*y的值没有改变,因为你交换的是2个形参的值,虽然你传入的是指针,但是你没有把它们当成指针来用,最后的结果跟传非指针值是一样的。
如果想真正改变实参的值,就必须交换指针指向的内存,而不是单纯交换指针变量本身。形参是通过堆栈传递的,只有用类似 *x = 1;这样的语句操作指针指向的内存,才能影响到实参,否则实参的值是不会改变的。
其实最好的方式就是去VS里调试运行,仔细观察运行过程,就能比较清晰地了解指针。单纯的理论是站不住脚的,拉出来溜溜就一清二楚了。
想对你能有帮助。