第04章 c语言复杂表达式与指针高级应用
4.2 指针数组与数组指针
分辨指针数组与数组指针:
找核心->找结合->继续向外结合直到整个符号结束
int *p; //核心是p,与*结合,是指针;与int结合,是整型指针
int p[5]; //核心是p,p先与中括号[]结合成数组,int结合,是整型数组
如果核心和小括号结合,表示是函数
int *p[5],核心是p,p先跟[]结合,表明是数组,*表示数组中的元素是指针,所以是一个指针数组。
int(*p)[5],核心是p,p是指针,指针指向一个数组,所以是一个数组指针。
4.3 函数指针与typedef
函数指针的实质(还是指针变量)
函数指针的实质还是指针,本身占4个字节(在32位系统中,所有的指针都是4字节)。
函数的实质是一段代码,这一段代码在内存中是连续分布的(一个函数的大括号括起来的所有语句将来编译出来生成的可执行程序是连续的),所以对于函数来说很关键的就是函数中第一句代码的地址。————这个地址就是所谓的函数地址。
函数指针的书写和分析方法
C语言本身就是强类型语言(每一个变量都有自己的变量类型)。
在一些弱类型语言中,他的变量是没有类型的。如脚本,它就是个弱类型语言。Makefile也是弱类型语言,在里面没有类型。
强类型语言中每一个变量、每一个符号都有自己的类型,类型本身是否匹配编译器可以帮助我们检查的。
假设有个函数void func(void), 该函数的传参是void类型,对应函数指针:void (*p)(void).p这个名字是随便起的,类型是void(*)(void)
#include <stdio.h>
void funcl(void)
{
printf("I am funcl.\n");
}
int main(void)
{
void (*pFunc)(void);
pFunc = funcl;
pFunc();
return 0;
}
函数名做右值时加不加&效果和意义是一样的。
写一个复杂函数指针的实例:
strcpy函数 char *strcpy(char *dest, const char *src);
对应函数指针 char*(*pFunc)(char* dest, const char *src);
#include <stdio.h>
#include <string.h>
in