函数指针的实质(还是指针变量)
(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