关于指向函数的指针的问题??

leon1741
博客专家认证
2008-05-30 08:44:23
问题如下:


int *ptr1,*ptr2; //全局变量

int max (int x, int y)
{
extern *ptr1;

if (x < y)
{
ptr1 = &y;
return y;
}
else
{
ptr1 = &x;
return x;
}
}

int min (int x, int y)
{
extern *ptr2;

if (x > y)
{
ptr2 = &y;
return y;
}
else
{
ptr2 = &x;
return x;
}
}

void main()
{
extern *ptr1,*ptr2;
int (*pointer)();
int a = 60, b = 90, maxone = 0, minone = 0;

ptr1 = &maxone;
ptr2 = &minone;
printf("%d,%d,%d,%d\n",*ptr1,maxone,*ptr2,minone);

pointer = max;
maxone = pointer(a,b);
printf("%d,%d,%d,%d\n",*ptr1,maxone,*ptr2,minone);

pointer = min;
minone = pointer(a,b);
printf("%d,%d,%d,%d\n",*ptr1,maxone,*ptr2,minone);
}


程序本来只是用来学习指向函数的指针的应用,但是遇到一个问题。
运行输出结果依次为:
0,0,0,0
0,90,0,0
60,90,60,60

为什么ptr1的值在调用max函数时不产生改变,反而在调用min函数后产生改变?
我还特地定义了两个单独的指针,ptr1与ptr2,应该不会相互串用吧?
而且,就算改变,也应该是等于90,怎么会等于60?
在max函数的调用时,不是将大的一个值的内容赋给ptr1吗?
...全文
145 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
qmm161 2008-05-31
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 LEON1741 的回复:]
感谢大家的踊跃回答
我觉得10楼说的比较有道理
原来是我没有搞清形参和实参的原理
将指针指向了一个随机的地址
这样难怪会出错了 呵呵……
[/Quote]
这个地址并不是随机的!
leon1741 2008-05-31
  • 打赏
  • 举报
回复
感谢大家的踊跃回答
我觉得10楼说的比较有道理
原来是我没有搞清形参和实参的原理
将指针指向了一个随机的地址
这样难怪会出错了 呵呵……
承影 2008-05-30
  • 打赏
  • 举报
回复
int max (int x, int y)
{
extern *ptr1;

if (x < y)
{
ptr1 = &y;//在这里y是栈中的一个临时变量,则ptr1指向的地址是随机的,函数返回后*ptr1的值有可能保留有可能被覆盖
//不建议这样用
return y;
}
else
{
ptr1 = &x;
return x;
}
}

应搞清实参和形参
chlaws 2008-05-30
  • 打赏
  • 举报
回复

//首先说下,你贴出来的代码我很怀疑楼主的编译器能编译过去

//帮看了下,主要是*ptr1在max中接收到&y的地址,但是出来的时候*ptr1是一个很大的值,输入的时候以0代替了
//帮你改了下,这样容易理解
#include <stdio.h>
#include <stdlib.h>

int ptr1,ptr2; //全局变量
int max (int x, int y)
{
//extern *ptr1;

if (x < y)
{
ptr1 = y;
return y;
}
else
{
ptr1 = x;
return x;
}

}

int min (int x, int y)
{
// extern *ptr2;

if (x > y)
{
ptr2 = y;
return y;
}
else
{
ptr2 = x;
return x;
}
}

void main()
{

int (*pointer)(int,int);
int a = 60, b = 90, maxone = 0, minone = 0;

ptr1 = maxone;
ptr2 = minone;
printf("%d,%d,%d,%d\n",ptr1,maxone,ptr2,minone);

pointer = max;
maxone = pointer(a,b);
printf("%d,%d,%d,%d\n",ptr1,maxone,ptr2,minone);

pointer = min;
minone = pointer(a,b);
printf("%d,%d,%d,%d\n",ptr1,maxone,ptr2,minone);
}

HelloDan 2008-05-30
  • 打赏
  • 举报
回复
int (*pointer)(); -- int (*pointer)(int,int);
是的,上面的也要改一下,我没看清楚,编译器也不报

HelloDan 2008-05-30
  • 打赏
  • 举报
回复

#include<stdio.h>

int *ptr1,*ptr2; //全局变量

int max (int x, int y)
{
extern int *ptr1;

if (x < y)
{
ptr1 = &y;
return y;
}
else
{
ptr1 = &x;
return x;
}
}


int min (int x, int y)
{
extern int *ptr2;

if (x > y)
{
ptr2 = &y;
return y;
}
else
{
ptr2 = &x;
return x;
}
}

int main()
{
extern int *ptr1,*ptr2;
int (*pointer)();
int a = 60, b = 90, maxone = 0, minone = 0;

ptr1 = &maxone;
ptr2 = &minone;
printf("%d,%d,%d,%d\n",*ptr1,maxone,*ptr2,minone);

pointer = max;
maxone = pointer(a,b);
printf("%d,%d,%d,%d\n",*ptr1,maxone,*ptr2,minone);

pointer = min;
minone = pointer(a,b);
printf("%d,%d,%d,%d\n",*ptr1,maxone,*ptr2,minone);
return 0;
}

0,0,0,0
90,90,0,0
90,90,60,60


Terminated with return code 0
Press any key to continue ...


K行天下 2008-05-30
  • 打赏
  • 举报
回复
我使用的是:

int (*pointer)(int,int);
prgmBaggio 2008-05-30
  • 打赏
  • 举报
回复
int (*pointer)();
函数指针类型不匹配
K行天下 2008-05-30
  • 打赏
  • 举报
回复
我在Dev C++运行正确是:
0,0,0,0
0,90,0,0
90,90,60,60
但是TC下和楼主一样的结果
jintianfree 2008-05-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 prgmBaggio 的回复:]
电脑上没装VC,你可以打印PTR1和PTR2的地址看看
象你这种写法的还没见过,不过
ptr1 = &x;
我觉得PTR1指向的是一个临时分配的内存区域,在退出max or min 的时候就被释放了
我猜的,最好用调试器跟踪一下指针值
[/Quote]

我把代码复制到vs 2005中
1>c:\编程之路\c&c++\practice\practice\integersetmain.cpp(11) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>c:\编程之路\c&c++\practice\practice\integersetmain.cpp(27) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>c:\编程之路\c&c++\practice\practice\integersetmain.cpp(43) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>c:\编程之路\c&c++\practice\practice\integersetmain.cpp(43) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>c:\编程之路\c&c++\practice\practice\integersetmain.cpp(51) : error C2440: “=”: 无法从“int (__cdecl *)(int,int)”转换为“int (__cdecl *)(void)”
1> 该转换要求 reinterpret_cast、C 样式转换或函数类型转换
1>c:\编程之路\c&c++\practice\practice\integersetmain.cpp(52) : error C2197: “int (__cdecl *)(void)”: 用于调用的参数太多
1>c:\编程之路\c&c++\practice\practice\integersetmain.cpp(55) : error C2440: “=”: 无法从“int (__cdecl *)(int,int)”转换为“int (__cdecl *)(void)”
1> 该转换要求 reinterpret_cast、C 样式转换或函数类型转换
1>c:\编程之路\c&c++\practice\practice\integersetmain.cpp(56) : error C2197: “int (__cdecl *)(void)”: 用于调用的参数太多
1>生成日志保存在“file://c:\编程之路\C&C++\practice\practice\Debug\BuildLog.htm”
1>practice - 8 个错误,0 个警告
========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========
prgmBaggio 2008-05-30
  • 打赏
  • 举报
回复
电脑上没装VC,你可以打印PTR1和PTR2的地址看看
象你这种写法的还没见过,不过
ptr1 = &x;
我觉得PTR1指向的是一个临时分配的内存区域,在退出max or min 的时候就被释放了
我猜的,最好用调试器跟踪一下指针值
leon1741 2008-05-30
  • 打赏
  • 举报
回复
如果说是函数有误,那么max函数与min函数完全一致,
为什么ptr2却能正确输出结果呢?

只是ptr1输出的结果不对,在max本身被调用时只改变了maxone的值,这是肯定的
但却没有改变ptr1的内容,为什么?
反而在min函数被调用时,ptr1的值却发生改变??

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧