函数指针及结构体

本文详细介绍了指针函数和函数指针的概念及其应用,包括指针函数的定义、函数指针的声明与使用、函数指针作为结构体成员的应用,以及通过typedef简化函数指针的声明。

函数及结构体


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。



### 函数指针 函数指针是指向函数指针变量,它存储的是函数的入口地址。通过函数指针可以在运行时动态调用不同的函数,为程序带来更高的灵活性可扩展性。 #### 定义 一般的函数指针定义形式如下: ```c int (*func)(int, int); ``` 这表示一个指向含有两个`int`参数并且返回值是`int`形式的任何一个函数指针。为了代码的移植考虑,通常使用`typedef`定义函数指针类型,例如: ```c typedef int (*FUN)(int, int); ``` #### 使用示例 假设有这样一个函数: ```c int add2(int x, int y) { return x + y; } ``` 在实际使用指针`func`时可以这样实现: ```c func = &add2; // 指针赋值,或者 func = add2; add2 与 &add2 意义相同 printf("func(3, 4)=%d\n", func(3, 4)); ``` ### 结构体 结构体是一种用户自定义的数据类型,它可以将不同类型的数据组合在一起,形成一个新的数据类型,方便对相关数据进行管理操作。 #### 定义变量声明 结构体定义变量声明有以下几种形式: - **形式1**:先定义结构体类型,再定义变量 ```c struct 结构体标识符 { 成员变量列表; … }; struct 结构体标识符 *指针变量名; ``` 变量初始化示例: ```c struct 结构体标识符 变量名 = {初始化值1,初始化值2,…,初始化值n }; ``` - **形式2**:在定义类型的同时定义变量 ```c struct 结构体标识符 { 成员变量列表; … } *指针变量名; ``` - **形式3**:直接定义变量,用无名结构体直接定义变量只能一次 ```c struct { 成员变量列表; … } *指针变量名; ``` 其中“指针变量名”为结构体指针变量的名称。形式1是先定义结构体,然后再定义此类型的结构体指针变量;形式2形式3是在定义结构体的同时定义此类型的结构体指针变量 [^1]。 #### 结构体变量的初始化 - **全部初始化**: ```c struct students = {"zhangsan", 'm', 19, 100}; ``` - **局部初始化**: ```c struct students = { .name = "zhangsan", .score = 100 }; ``` #### 结构体成员的访问 - `.`:结构体变量类型访问成员变量 - `->`:结构体指针类型访问成员变量 [^5]。 ### 函数指针结构体的结合应用 在C语言程序中,数据结构算法是两个基本的元素。C语言的基本数据类型、结构体、数组联合体是数据结构的代表;C语言中的函数则是算法的代表。将函数指针作为结构体成员,可以将数据结构算法有机结合,构成具有一定功能的程序 [^4]。 ### 结构体指针的相关特性 指针里面存放的地址在32位处理器中是4字节。定义结构体指针时,指针结构体变量在内存里都有对应的空间 [^3]。结构体指针可以设置为全局变量或局部变量,例如: ```c struct point { int x; int y; } b1, b2; // 全局变量 b1,b2 int main() { struct point b; // 局部变量 b } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值