你把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分配内存成功
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)