函数指针与typedef,函数指针实战

函数指针的实质(还是指针变量)

(1)函数指针的实质还是指针,还是指针变量,占4个字节。

(2)与普通指针,数组指针,没有啥区别,区别是在于指针指向的是什么。

(3)函数的实质是一段代码,这一段代码在内存中是连续分布的(一个函数的大括号括起来的所有语句将来编译出来生成的可执行程序是连续的),多以对于函数来说很关键的就是函数中的第一句代码的地址,这个地址就是所谓的函数地址,在我们C语言中用函数名(一段代码的首地址)表示,

(4)结合函数的实质,函数指针就是一个普通变量,这个普通变量的类型是函数指针变量类型,他的值就是某个函数的地址(也就是他的函数名这个符号在编译器中对应的值)

函数指针的书写和分析方法

(1)c语言本身是强类型语言(每一个变量都有自己的变量类型),编译器可以帮我们严格的类型检查。

(2)所有的指针变量类型其实本质是一样的,

#include<stdio.h>

int main(void)
{
    int *p;
    int a[5];

    p = a;
    
    int (*p1)[5];
    p1 = &a;               //p1是数组指针,所以应该给一个指向数组的地址
    
    return 0;
}

(3)假设我们有个函数是:void func(void);对应函数指针:void (*p) (void);

类型是:void (*) (void);

(4)函数名和数组名最大的区别就是:函数名做右值时加不加&效果和意义都是一样的:但是数组名做右值时加不加&意义就不一样。

(5)写一个复杂的函数指针的实例:strcpy函数(char *strcpy(char *dest,const char *src);),对应的函数指针是:char *(*pFunc) (char *dest, const char *src);

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

int main(void)
{
    char a[5] = {0};
    char* (*pFunc)(char *, const char *);
    pFunc = strcpy;
    pFunc(a, "abc");
    printf("a = %s.\n",a);

    return 0;
}

typedef关键字的用法

(1)typedef是C语言中一个关键字,作用是用来定义(或者叫重新命名类型)

(2)C语言中的类型一共2种:一种是编译器自己带的,第二种是用户自定义类型不是语言自己带的,是程序员自己定义的,比如结构体类型,数组变量类型......

(3)我们今天讲的函数指针,指针数组,数组指针都是用户自定义类型。

(4)有时候自定义类型太长了,用起来不方便,所以用typedef重命名一个简单好记的名字。

(5)typedef是给类型重命名,加工出来的都是类型而不是变量。

char* (*pType)(char *, const char *);

int main(void)

{

  pType p3;   //等效  char* (*p3)(char *, const char *);

}

typedef与#define宏的区别

typedef  (旧)char    *pchar(新);

#define  (新)pchar  char*(旧)

typedef与结构体

(1)结构体在使用时都是先定义结构体类型,在用结构体类型去定义变量。

(2)C语言语法规定,结构体类型使用时必须是struct 结构体类型名  结构体变量名;这样的方式来定义变量。

            typedef struct student

            { 

                char  name[20];

                int     age;

            }student_s;

定义一个结构体类型,第一个名字叫  struct student,第二个叫student_s

//我们一次定义2个类型:
//第一个是结构体类型,有2个名字:struct teacher, teacher
//第二个是结构体指针类型,有2个名字,struct teacher *,  pTeacher

typedef struct teacher
{
    char name[20];
    int  age;
    int  mager;
};teacher, *pTeacher;


int main(void)
{
    teacher t1;
    t1.age = 23;
    pTeacher p1 = &t1;
    printf("teacher age = %d.\n",p1 -> age);
    
    struct student *pS1;
    student *pS2;

    return 0; 
}

(3)一次定义2个类型,一个是变量类型,一个是结构体指针类型

typedef与const

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值