函数指针及结构体

函数及结构体


1.指针函数


     指针函数即带指针的函数,其本质仍为一个函数,指针函数的返回类型是某一类型的指针。
     如char *function1(char *s1, char *s2); 函数名为function1,返回值类型是一个指向char类型的指针。
     如char **function2(char *s1, char *s2); 函数名为function2,返回值类型是char **,是个二级指针。
例:
#include <stdio.h>
char *function(char *s1);

int main(void)
{
    char str1[] = "hello!";
    char *str2 = NULL;
    str2 = function(str1);
    printf("%s\n",str2);
     //while(1);
    return 0;
}
char *function(char *s1)
{
    return s1;
}


 

2.函数指针

     函数指针是指向函数的指针变量。故函数指针本质上是一个指针变量,它指向一个函数。在C编译时,每个函数都有一个入口地址,该入口地址就是函数指针指向的地址。有了指向函数的指针变量后,就可以用该指针变量调用函数。
     如char * (*function)(char *s1, char *s2); function不是函数名,而是一个指针变量,它指向一个函数。这个函数有两个指针类型的参数,返回值类型为char *。由于()的优先级高于*,故一定要加小括号。第一个*表示这是一个返回值类型为指针的函数,第二个*表示function为函数指针。
     注意:简单声明一个函数指针并不能立即使用,和其他指针一样,在函数指针执行间接访问之前需将其先初始化为指向某个函数。
例:
#include <stdio.h>
char *function(char *s1);
int main(void)
{
    char str1[] = "hello!";
    char *str2 = NULL;
    char * (*f)(char *s); //f : 函数指针
    f = &function;
    str2 = (*f)(str1);

    printf("%s\n",str2);
    //while(1);
    return 0;
}
char *function(char *s1)
{
    return s1;
}


 
注:f = &function;中,操作符&可以省略,因为函数名在被使用时总是由编译器把它转换为函数指针,&操作符只是显示地说明了编译器将隐式执行的任务。

4.函数指针作为结构体成员

     结构体成员可以是指针变量,而函数指针为指针变量。函数指针可以作为结构体成员。
例:
#include <stdio.h>
char *function(char *s1);
struct strf{
       char * (*f)(char *s); //f : 函数指针
};
int main(void)
{
       char str1[] = "hello!";
       char *str2 = NULL;
       struct strf strf1;
       strf1.f = &function;
       str2 = (*strf1.f)(str1);
       //str2 = strf1.f(str1);
       printf("%s\n",str2);
       //while(1);
       return 0;
}

char *function(char *s1)
{
	return s1;
}

注:结构体变量调用函数指针时和一般调用函数指针不一样,上例中str2 = (*strf1.f)(str1);str2 = strf1.f(str1);都可以。

5.typedef与函数指针

     如:typedef int  (*fp)(int);可以理解为int (*)(int)为一个数据类型,那么typedef int  (*fp)(int);则为这个数据类型重新取一个别名为fp,以后就可以像int,char一样使用了。如
fp function;即定义了一个指针变量function。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值