函数指针
指向某种函数类型的指针,其本质是指针。
通过函数指针,可以将函数赋到函数指针上,通过函数指针的调用来调用函数。
也可以像普通的类型一样,可以做强制类型转换。
1 //函数指针的基本运用----定义、赋值、调用 2 # include <stdio.h> 3 int Max(int, int); 4 int main(void) 5 { 6 int(*p)(int, int); //函数指针的定义 7 int a, b, c; 8 p = Max; //函数指针赋值 9 printf("please enter a and b:"); 10 scanf("%d%d", &a, &b); 11 c = p(a, b); //通过函数指针调用Max函数 12 printf("a = %d\nb = %d\nmax = %d\n", a, b, c); 13 return 0; 14 } 15 int Max(int x, int y) 16 { 17 int z; 18 if (x > y) 19 { 20 z = x; 21 } 22 else 23 { 24 z = y; 25 } 26 return z; 27 } 28 //函数指针的另一些使用,可以当作类型(代码为节选) 29 //Hint: HINSTANCE Hint = LoadLibrary("sqlite3.dll"); 30 //GetProcAddress函数的作用是:检索指定的动态链接库(DLL)中的输出库函数地址 31 //第二行代码的作用是:将sqlite3.dll中sqlite3_exec函数的地址取出并赋给定义为FUNT该种函数类型的sqlite3_exec函数(相当于重定义) 32 typedef int (*FUNT)(sqlite3*, const char*, int (*)(void*, int, char**, char**), void*, char**); 33 FUNT sqlite3_exec = (FUNT)GetProcAddress(Hint,"sqlite3_exec");
tips:
函数指针声明为指针,它与变量指针不同之处是,它不是指向变量,而是指向函数
(1)函数指针的实质还是指针,还是指针变量。本身占4字节(在32位系统中,所有的指针都是4字节) (2)函数指针、数组指针、普通指针之间并没有本质区别,区别在于指针指向的东西是个什么玩意。 (3)函数的实质是一段代码,这一段代码在内存中是连续分布的(一个函数的大括号括起来的所有语句将来编译出来生成的可执行程序是连续的),所以对于函数来说很关键的就是函数中的第一句代码的地址,这个地址就是所谓的函数地址,在C语言中用函数名这个符号来表示。 (4)结合函数的实质,函数指针其实就是一个普通变量,这个普通变量的类型是函数指针变量类型,它的值就是某个函数的地址(也就是它的函数名这个符号在编译器中对应的地址值)
指针函数
函数都有返回值,若是void即返回值为空的函数,而指针函数是“返回值”为指针(这里指指针本身的地址)的函数。
1 //指针函数的基本使用 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <string.h> 5 6 char *InitMemory() //指针函数 7 { 8 char *s = (char *)malloc(sizeof(char) * 32); //申请存放类型为char *的连续空间 9 printf("--------------------------------------------------\n"); 10 printf("InitMemory:%d\n",*s);//打印的是s指针指向的地址中存放的内容 11 printf("InitMemory2:%p\n",s);//打印的是s指针存放的地址 12 printf("InitMemory3:%p\n",&s);//打印的是s指针自身的地址 13 printf("InitMemory4:%p\n",*&s);//打印的是s指针自身的地址存放的地址 14 printf("InitMemory5:%p\n",&*s);//打印的是s指针指向的地址的取地址本身 15 printf("--------------------------------------------------\n"); 16 return s;//返回s指针本身的地址 17 } 18 19 int main() 20 { 21 char *ptr = InitMemory();//定义一个指向类型为char的指针ptr,ptr指针指向指针函数返回的s指针(s指针本身的地址) 22 printf("main1:%c\n",*ptr); 23 printf("main2:%p\n",ptr); 24 printf("main3:%p\n",&ptr); 25 printf("main4:%p\n",*&ptr); 26 printf("main5:%p\n",&*ptr); 27 strcpy(ptr, "helloworld"); 28 printf("--------------------------------------------------\n"); 29 printf("main6:%c\n",*ptr); 30 printf("main7:%p\n",ptr); 31 printf("main8:%p\n",&ptr); 32 printf("main9:%p\n",*&ptr); 33 printf("main10:%p\n",&*ptr); 34 printf("%s\n", ptr); 35 36 free(ptr); 37 38 return 0; 39 }
tips:
指针函数的作用
可以在是代码更简洁并在一定程度节约内存;
如当你需要返回一个数组中的元素时,就只需返回首元素的地址给调用函数,调用函数即可操作该数组(让函数返回多个值)。
或者是malloc函数动态分配内存,在另一函数中返回该内存的地址来进行该段地址内容的操作(如上例)。
指针函数是函数,故需要声明、定义、调用(与变量的定义、赋值、调用不同)
1 int Func(int x); /*声明一个函数*/ 2 int (*p) (int x); /*定义一个函数指针*/
浙公网安备 33010602011771号