新手笔记-函数指针的简单应用

 将字符串赋到data中
 1
int strcpy1(char *brr, char *crr) 2 { 3 int i=0; 4 while(*(crr+i)) 5 { 6 *(brr+i) = *(crr+i); 7 i++; 8 } 9 10 *(brr+i) = '\0'; //写到了*(crr+i)造成段错误 11 } 12 13 int main() 14 { 15 int i; 16 char *arr = "hello!"; 17 char data[1024] = {0}; 18 19 int (*p)(char *, char *) = strcpy1; 20 p(data, arr); 21 22 printf("%s \n", data); 23 }

输出结果:hello!

原因:*(crr+i)在只读区,所以会段错误!

方法二:

 1 #include <stdio.h>
 2 
 3 char * strcpy1(char *brr, char *crr)
 4 {
 5         int i=0;
 6         while(*(crr+i))
 7         {
 8                 *(brr+i) = *(crr+i);
 9                 i++;
10         }
11 
12         *(brr+i) = '\0';  //写道了*(crr+i)
13         return brr;
14 }
15 
16 int main()
17 {
18         int i;
19         char *arr = "hello!";
20         char data[1024] = {0};
21 
22         char *(*p)(char *, char *) = strcpy1;
23         char *red = p(data, arr);
24 
25         printf("%s \n", red);
26 }

实现字符串的倒置:

#include <stdio.h>
#include <string.h>

char *fox(char *dest, char *src)
{
        int i, j;
        for(i=strlen(src)-1, j=0;i>=0; i--,j++)//sizeof(src)是四个字节,src是指针
        {
                *(dest+j) = *(src+i);
        }

        *(dest+j) = '\0';
        return dest;
}

int main()
{
        char *p = "hello!";

        char data[1024] = {0};

        char *(*fp)(char *, char *);
        fp = fox;
        char *red = fp(data, p);

        printf("%s \n", red);
}

注意:在fox函数中使用sizeof()返回的是指针src的大小即4字节,而不是src指向字符串的长度。

回调函数和结构体内使用函数指针:

 1 #include <stdio.h>
 2 
 3 struct person{
 4         int (*p)(int, int);
 5 };
 6 
 7 int mtod(int m, int d)
 8 {
 9         static int month[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
10         int days = 0;
11         int i, j;
12 
13         if(m == 1)
14                 return d;
15         else
16         {
17                 for(i=0; i<=m-2; i++)
18                         days = days + month[i];
19                 return days+d;
20         }
21 }
22 
23 int time(int (*p)(int, int), int i, int j)
24 {
25         p(i, j);
26 }
27 
28 int main()
29 {
30         int i, j, k, l;
31         i = mtod(12,31);
32         printf("%d \n", i);
33 
34         int (*p)(int, int) = mtod;
35         j = p(1,1);
36         printf("%d \n", j);
37 
38         k = time(p, 2, 10);
39         printf("%d \n", k);
40 
41         struct person jim;
42         jim.p = mtod;
43         l = jim.p(12,30);
44         printf("%d \n", l);
45 }

今天主要内容就这些,感觉有些绕,需要更加熟练。

 

转载于:https://www.cnblogs.com/luoxiang/p/4028191.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值