| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 582 人关注过本帖
标题:看到指针函数有点不明白
只看楼主 加入收藏
cuijingchun
Rank: 3Rank: 3
来 自:黑龙江
等 级:论坛游侠
威 望:1
帖 子:108
专家分:186
注 册:2011-9-28
结帖率:90%
收藏
已结贴  问题点数:20 回复次数:8 
看到指针函数有点不明白
# include <stdio.h>
# include <string.h>
char *day_name(int n);

main(void)
{
  int i;
  char *day_name(int n); //这个算是函数, 还是别的  
  printf("input Day No:\n");
  scanf("%d",&i);
//  if(i<0)
//      exit(1);
  printf("Day No:%2d-->%s\n",i,day_name(i));
}
char *day_name(int n){
  static char *name[]={ "Illegal day",  
                        "Monday",
                        "Tuesday",
                        "Wednesday",
                        "Thursday",
                        "Friday",
                        "Saturday",
                        "Sunday"};
  return((n<1||n>7) ? name[0] : name[n]);//这个是什么意思,是如何反回并输出的
}    name[0] : namel[n]

[ 本帖最后由 cuijingchun 于 2012-1-18 17:28 编辑 ]
搜索更多相关主题的帖子: void include 
2012-01-18 17:26
share32
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:214
专家分:663
注 册:2011-12-1
收藏
得分:2 
你这是写了些什么?自己能运行吗?
char *day_name(int n); 是函数声明。因为你的子函数写在主函数后面,所谓必须要声明一下,才能在主函数使用。
你这程序有问题。
收到的鲜花
  • cuijingchun2012-01-19 11:10 送鲜花  1朵   附言:这是书上的,我就是看不明白才来问问的, 能 ...
2012-01-18 18:32
zhangxiangD
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:39
专家分:119
注 册:2011-12-20
收藏
得分:8 
# include <stdio.h>
# include <string.h>
 char *day_name(int n);
 main(void)
 {
   int i;
   char *day_name(int n); //这个算是函数, 还是别的 ?这是一个函数,一个返回指向字符型指针的函数。
   printf("input Day No:\n");
   scanf("%d",&i);
 //  if(i<0)
//      exit(1);
   printf("Day No:%2d-->%s\n",i,day_name(i));
 }
 char *day_name(int n){
   static char *name[]={ "Illegal day",  
                         "Monday",
                         "Tuesday",
                         "Wednesday",
                         "Thursday",
                         "Friday",
                         "Saturday",
                         "Sunday"};
   return((n<1||n>7) ? name[0] : name[n]);//这个是什么意思,是如何反回并输出的
 }    //这里要注释掉name[0] : namel[n]
 这个程序不过是要输入星期几,返回它的英文。很简单的一个程序!
 
收到的鲜花
  • cuijingchun2012-01-19 11:08 送鲜花  5朵   附言:谢谢了,明白了, 这个给你补上5分,
2012-01-18 18:44
zhangxiangD
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:39
专家分:119
注 册:2011-12-20
收藏
得分:0 
return((n<1||n>7) ? name[0] : name[n]);//这里用到了双目运算符?:,若()是真的,返回冒号前一个值,若是假,则返回冒号后一个值。
2012-01-18 18:47
zhangxiangD
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:39
专家分:119
注 册:2011-12-20
收藏
得分:0 
我说错了,是三目运算符!
2012-01-18 18:48
weipeng1217
Rank: 5Rank: 5
等 级:职业侠客
帖 子:175
专家分:386
注 册:2012-1-12
收藏
得分:5 
char *day_name(int n); //这个算是函数, 还是别的    这个叫指针函数

return((n<1||n>7) ? name[0] : name[n]);//这个是什么意思,是如何反回并输出的    三目运算符,你可以这样理解:如果()内为真(非0),就返回冒号之前的表达式的值                                        反之,若()内为假(0),就返回冒号后面的表达式的值。。
 

C坛友交流群 群号:161091913 ,欢迎经常在线的朋友加入,一起学习,一起进步。。
2012-01-18 18:54
俺是小c
Rank: 2
来 自:上海师范大学
等 级:论坛游民
帖 子:38
专家分:64
注 册:2012-1-17
收藏
得分:0 
意思和六楼差不多。
第一个问题叫指针函数。第二个问题呢,简单通俗易懂的解释一下吧:   
  a?b:c,这叫三目运算符,运算方式是 第一步判断问号前的a是否为真,为真就取冒号前的b,为假取冒号后的c。

我叫小C,希望在编程生活里认识很多志同道合的朋友。
2012-01-18 20:49
apull
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:三体星系
等 级:版主
威 望:216
帖 子:1506
专家分:9241
注 册:2010-3-16
收藏
得分:2 
char *day_name(int n); //这个算是函数, 还是别的  
     这个是一个指针型函数,输入一个整型参数,返回一个字符串指针。

return((n<1||n>7) ? name[0] : name[n]);//这个是什么意思,是如何反回并输出的
       当你输入正确时返回相应的星期名字,不然就返回"Illegal day"。

 


[ 本帖最后由 apull 于 2012-1-19 00:55 编辑 ]
2012-01-19 00:53
HuErr
Rank: 1
等 级:新手上路
帖 子:2
专家分:8
注 册:2012-1-19
收藏
得分:3 
楼主何必把他理解得这么复杂呢。你函数指针搞不懂,那就说明你指针根本不清楚。让小生慢慢为你道来:
指针他就是一种特殊的变量,不管是多少重指针,不管是什么类型,他就在内存中占4个字节。
EG:
char********************* p    //占4字节
int*****    p         //占4字节
char*    //4字节
int*     //4字节
当然我们这里说的是32位操作系统下。
函数指针,其实他也只占4个字节。他也是个变量。他起名“函数指针”难道他一定得是函数的开始地址吗?我把他指
向别的地方难道就错了吗?当然不会。
我们来看一个例子:
#include "stdafx.h"

int func(int a,int b)
{
    int* (*p)(int a,int b);        //定义一个函数指针p,
    int* buffer[0x100];              //定义一个BUF,里面装我们的要填充的CODE      
    int nResult;                     //存储我们P指向的“函数”返回值,这里函数指了引号,想必大家知道为什么了。              

    buffer[0]=(int*)0x0424448b;        //buf里面的内容如果会汇编的话应该很明白在下面我们做了解释
    buffer[1]=(int*)0x08244403;        
    buffer[2]=(int*)0xc3;

    p = (int*(*)(int a,int b))&buffer[0];    //把buffer的地址给了函数指针。
    nResult = (int)p(7,8);                    //现在我们就跳到buffer的地址去执行了,由于我们在buffer里填的机器码是对参数a,b做加法,所以返回给nresult的时候是a,b的和
    printf("%d\n",nResult);
    return nResult;
}

int main(int argc, char* argv[])
{
    func(1,2);
    printf("Hello World!\n");
    return 0;
}

//int* buffer[0x100];里面的内容。就是对a和b做了加法。
0012FB20 8B 44 24 04          mov         eax,dword ptr [esp+4]
0012FB24 03 44 24 08          add         eax,dword ptr [esp+8]
0012FB28 C3                   ret


//这是我注册这里的一次发贴。。。。

[ 本帖最后由 HuErr 于 2012-1-19 10:23 编辑 ]
收到的鲜花
  • cuijingchun2012-01-19 11:02 送鲜花  5朵   附言:不太懂,还要加强啊,汇编以后还要看一看吧,
2012-01-19 10:22
快速回复:看到指针函数有点不明白
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024446 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved