C指针问题,为什么需要指针?

我在谭浩强的C程序设计里面看到的一道题
练习函数指针作为参数的,有这么一个例题:
#include "stdafx.h"
int max(int a,int b)
{
if(a>b)
{
return a;
}
else
{

return b;
}
}
int min(int a,int b)
{
if(a<b)
{
return a;
}
else
{
return b;
}
}
int add(int a,int b)

{
return a+b;
}
int fun(int x,int y,int (*p)(int,int))
{
return (*p)(x,y);

}

int _tmain(int argc, _TCHAR* argv[])
{
int max(int,int);
int min(int,int);
int add(int,int);
int a=13,b=22,n;
printf("please choose 1,2 or 3");
scanf("%d",&n);
int fun(int x,int y,int (*p)(int,int));
if(n==1)
{
printf("%d",fun(a,b,max));
}
if(n==2)
{
printf("%d",fun(a,b,min));
}
if(n==3)
{
printf("%d",fun(a,b,add));
}

}

函数就不用解释了,我的问题是,为什么要用指针呢?谭浩强的书上也说了可以不用指针,但是对于函数个数多的话,指针会很方便,我又写了一个不用指针的C程序:
#include "stdafx.h"
int max(int a,int b)
{
if(a>b)
{
return a;
}
else
{

return b;
}
}
int min(int a,int b)
{
if(a<b)
{
return a;
}
else
{
return b;
}
}
int add(int a,int b)

{
return a+b;
}
int _tmain(int argc, _TCHAR* argv[])
{
int max(int,int);
int min(int,int);
int add(int,int);
int a=13,b=22,n;
printf("please choose 1,2 or 3");
scanf("%d",&n);
if(n==1)
{
printf("%d",max(a,b));
}
if(n==2)
{
printf("%d",min(a,b));
}
if(n==3)
{
printf("%d",add(a,b));
}

}
明显不用指针的程序代码比用指针的代码还少,根本就不是指针更简便,既然不用指针会有更少的代码,为什么还用指针?我知道是为了可以控制内存,但是这道题里,用指针明显是更麻烦的。为什么谭浩强在这道题说指针更简便?

指针在你这个小程序能体现多大价值?
等需要高级点的数据结构,以及高级点的算法,就需要指针了。

谭浩强这题,是体现指向函数的指针的作用,用指针保存函数的地址,调用这个函数,可直接通过指针调用。

在QT,GTK之类的GUI库里,它们会提供一个函数,供开发者将 自定义函数 与指定事件关联;
因为 GUI库的开发者 不知道 使用者 是用什么函数,只有用个函数指针,保存 使用者 给的函数的地址,等事件触发后,通过该函数指针调用使用者的自定义函数。追问

也就是说这里根本不需要指针是吧

追答

动态内存需要用到指针。
被调用的函数,要使传入的参数的值的变化能够作用在上级函数中,那么,需要指针保存该变量的地址,以对其操作。

小程序功能简单,又不需要考虑内存开销,用不了多少C语言高级点的功能。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-10-30
年轻人,虽然我没看你的代码,你说不用指针代码更少,不错当然节省了空间,但是你想过用指针比不用指针速度快吗? 这其中的空间和时间关系是很微妙的。 这其实都不重要,重要的是,如果想精通C,想成为C高手,我劝你 以后写程序能用指针尽量用指针,数组能被指针代替的,尽量用指针,不是仅仅掌握了if while 等结构就行了的,,指针、结构体等才是C的精华。 比如 int *(*(*a)[5])(int *) ;你懂吗 、 二维数组 a[2][2]; a、*a、**a三者有什么区别, *a[1] (*a)[1]又有什么区别 当初我也自觉的会了if while 等结构,自信满满,,后来看了C和指针 这书后,自信被打得支离破碎,才知道自己多肤浅。
第2个回答  2012-10-30
原先给的例子并不好。
例子如下:
#include <stdio.h>
int max(int a,int b)
{
if(a>b) return a;
else return b;
}
int min(int a,int b)
{
if(a<b) return a;
else return b;
}
int add(int a,int b)
{
return a+b;
}
int (*pArr[])(int, int) = {&max, &min, &add}; // 创建一个函数指针数组来存上述函数
int fun(int x,int y,int (*p)(int,int))
{
return (*p)(x,y);
}
int main()
{
int a=13,b=22,n;
printf("please choose 1,2 or 3\n");
scanf("%d",&n);
//调用时不再需要判断n的值取调用哪个函数了,对应指针数组就可以了,方便了吧。
printf("%d",fun(a,b,pArr[n-1]));
return 0;
}本回答被网友采纳
第3个回答  2012-10-30
注意:练习函数指针作为参数的例题
那我问你:你不用指针,你现在能理解函数指针了吗?
要是你不学会用指针的话,那你没学会C语言。。。。
有时是必须要有指针的 否则你没法解决问题。。。。
道理就这么简单!
书中举例没问题!
第4个回答  2012-10-30
纠结这干嘛,学程序的都知道谭浩强的书不好,他只是为了引出指针而已,指针的作用就在于指向地址,在后面链表啊,堆栈啊,队列啊,串啊都会很有用。纠结谭浩强书的每个字句都是在自找麻烦罢了.....
相似回答