某类函数返回值是指针,怎样以指向函数的指针为参数调用这类函数

某类函数返回值是指针,怎样以指向函数的指针为参数调用这类函数,第1张

你把head从函数里面拿出来,作为参数就可以了啊。

之前需要定义一个函数指针:typedef

struct

_Node

(Fun)(struct

_Node

p);

然后定义show函数:

void

show(Fun

fun,

struct

_Node

head)

{

struct

_Node

pTemp

=

NULL;

pTemp

=

fun(head);

}

这样就可以把head传进来了~

如果使用指针作为参数就是地址传递,否则只是值传递。你可以看下下面的这个函数:

void modify(int a)

{

a++;

}

void main()

{

int a=5;

modify(a);

printf("%d",a);

}

这个程序的答案还是5。为什么?

因为当调用modify(a)时,在执行modify函数时,是另外开辟了一个内存空间,将main中a的值复制过来,modify函数中所有的 *** 作都是相对于这个新开辟的内存空间而言的,对原来的a没有任何改变。

现在就来说说指针,如果用指针传参的话那就完全不一样了,指针(pointer),说白了即是指向变量内存地址。同样上面的例子:

void modify(int a)

{

(a)++;

}

void main()

{

int a=5;

modify(&a);

printf("%d",a);

}

这个答案当然是6

因为你传进去的是a的地址,所以在modify函数中的 *** 作都是对a地址上的内容进行 *** 作,即是 *** 作a所以modify函数不用返回这个数,main中a的值也会改变。因为大家都是 *** 作同一个内存空间,而上面不用指针,modify *** 作的是另一个新开辟的内存空间,只是这个内存空间初始值和a一样。

你在子函数中要对你的主调用函数中变量进行 *** 作时也可以用指针做参数,这样子函数就可以不用return 如果不是用指针的话,就要再子函数的未尾加上一条return x;把这个数返回当返回值。

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++引入的很多新特性需借助引用来实现,比如,拷贝构造函数等等。

函数指针的声明方法为:

返回值类型 (  指针变量名) ([形参列表]);

注1:“返回值类型”说明函数的返回类型,“(指针变量名 )”中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。

例子:

#include<stdioh>

int max(int x,int y){return (x>y x:y);}

int main()

{

    int (ptr)(int, int);

    int a, b, c;

    ptr = max;

    scanf("%d%d", &a, &b);

    c = (ptr)(a,b);

    printf("a=%d, b=%d, max=%d", a, b, c);

    return 0;

}

分类: 电脑/网络 >> 程序设计 >> 其他编程语言

问题描述:

大家帮我看下下面这个程序中的注释,看看那样改为什么不行

void getptr(int p,int num)

{

p=(int )maccol(numsizeof(int));/这里为什么定义一个指向指针的指针,定义一个指针为什么不行,在为主函数指针分配动态内存时不能用p==(int )maccol(numsizeof(int))吗?/

return;

}

void main()

{

int ptr;

int k;

getptr(&ptr,10);/这里的实参为什么不能改成ptr,指针实参传给形参的不是地址吗?,ptr不就是指针的地址吗?/

for(k=0;k<10;k++)

{

scanf("%d",&ptr[k]);

}

}

请帮帮看下,注释里的理解有误吗?谢!

解析:

按你的意思,程序改成如下:(后面说明为什么不行)

void getptr(int p,int num)

{

p=(int )maccol(numsizeof(int));

return;

}

void main()

{

int ptr;

int k;

getptr(ptr,10);

for(k=0;k<10;k++)

{

scanf("%d",&ptr[k]);

}

}

首先要说明的是int ptr,这时候ptr指向一个不明确的地址,在这种情况下getptr(ptr,10);这一句传一个地址给getptr里面的p指针,这时候p指针获得的是ptr指针的一个副本,确切的说是ptr指向的对象的内存地址,所以这种方式在函数里面可以用来传一个指针指向的数据,这个数据是引用,但是指针还是副本,就是p与ptr两个所指的数据是一样的,但是两个在内存的地址是不一样的

而你这个程序要求的是给ptr动态分配内存,所以当分配了一块的内存,并且这个内存的首地址赋给p,这时候p指向的东西改变了,但没有影响到ptr指针ptr指针指向的还是他原来的数据,只是p指针的数据改变了

所以这种情况引入一个指针的指针,让p指针指向ptr这个指针(而不是ptr的副本),这时候动态的分配的数据块传给p,这个p就是ptr,所以给ptr分配内存成功

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12158813.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存