0

0

0

修罗

站点介绍

只有了解事实才能获得真正的自由

复杂函数

修罗 2024-11-06 187 1条评论 c

首页 / 正文

复杂函数

如下函数定义:

int *(*(*pfun)(int *))[10];

解析法则:

  1. 找到变量名,找出变量名和谁结合,再向变量名右边看;
  2. 从左到右看时,遇到右圆括号调转方向,此时变成从右往左看,遇到左圆括号又调整方向;
  3. 返回值最后看;

解析实战:

  1. 找到变量名pfun,找出pfun和*结合,说明pfun是一个指针 ,此时不知道指针指向类型,
  2. 往右看遇到括号掉头,再往左看,再掉头;
  3. 此时遇到的是另外一个括号(int *),因此说明指针所指向的是一个函数,参数是一个整型指针,此时不知道函数的返回值;
  4. 然后又向相反的方向看,又遇到了一个*,说明该函数的返回值又是一个指针 ,此时不知道是什么类型的指针;
  5. 在往左看又遇到括号,所以再次调转方向,把内侧的括号里的内容看完,出了括号遇到的是数组,说明指针指向的是数组;
  6. 最后往左看,数组元素是指针,指针类型是int。

得出结论:首先fpun是一个指向函数的函数指针,该函数有一个整型指针类型的参数并且返回值也是一个指针,所返回的类型指向的是一个数组,并且这个数组有10个元素,每个元素是整型指针类型。

再通过法则看函数声明

案例一:

int (*func)(int *pInt);
  1. 首先找到标识符func,
  2. 它的外面有一对圆括号,而且左边是一个*号,这说明func是一个指针,
  3. 然后跳出这个圆括号,先看右边,也是一个圆括号,这说明(*func)是一个函数,而func是一个指向这类函数的指针,就是一个函数指针,
  4. 这类函数具有int*类型的形参,返回值类型是 int。

案例二:

int (*func)(int *p, int (*f)(int *));
  1. func被一对括号包含,且左边有一个*号,说明func是一个指针,
  2. 跳出括号,右边也有个括号,那么func是一个指向函数的指针,
  3. 这类函数具有int *int (*)(int*)这样的形参,返回值为int类型。
  4. 再来看一看func的形参int (*f)(int*),类似前面的解释,f也是一个函数指针,
  5. 指向的函数具有int*类型的形参,返回值为int。

案例三:

int (*func[5])(int *pInt);
  1. func右边是一个[]运算符,说明func是一个具有5个元素的数组,
  2. func的左边有一个*,说明func的元素是指针,要注意这里的*不是修饰 func的,
  3. 而是修饰func[5]的,原因是[]运算符优先级比*高,func先跟[]结合,
  4. 因此*修饰的是func[5]。跳出这个括号,看右边,也是一对圆括号,
  5. 说明func数组的元素是函数类型的指针,它所指向的函数具有int*类型的形参,返回值类型为int。

案例四:

int (*(*func)[5])(int *pInt);
  1. func被一个圆括号包含,左边又有一个*
  2. 那么func是一个指针,跳出括号
  3. 右边是一个[]运算符号,说明func是一个指向数组的指针,
  4. 现在往左看,左边有一个*号,说明这个数组的元素是指针,

案例五:

int func(void)[5];
  1. func是一个返回值为具有5个int元素的数组的函数。
  2. 但C语言的函数返回值不能为数组,这是因为如果允许函数返回值为数组,
  3. 那么接收这个数组的内容的东西,也必须是一个数组,但C语言的数组名是一个右值,
  4. 它不能作为左值来接收另一个数组,
  5. 因此函数返回值不能为数组。

案例六:

int func[5](void)
  1. func是一个具有5个元素的数组,这个数组的元素都是函数。
  2. 这也是非法的,因为数组的元素除了类型必须一样外,
  3. 每个元素所占用的内存空间也必须相同,显然函数是无法达到这个要求的,
  4. 即使函数的类型一样,但函数所占用的空间通常是不相同的。

评论(1)

  1. xiaolen 游客 2024-11-25 15:48 回复

    41


最新评论

  • 1

    1

  • 1

    1

  • -1' OR 2+158-158-1=0+0+0+1 or 'TKCTZnRa'='

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • @@5Qa2D

    1

  • 1

    1

  • 1

    1

日历

2025年09月

 123456
78910111213
14151617181920
21222324252627
282930    

文章目录

推荐关键字: Linux webpack js 算法 MongoDB laravel JAVA jquery javase redis