0

0

0

修罗

站点介绍

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

复杂函数

修罗 2024-11-06 422 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


最新评论

  • https://www.studyglobus.com/author/carroll34a5552/

    Ценники на вывоз мусора сейчас космос, любые лайфхаки по экономии в тему.

  • Richardgrold

    1xbet onlayn kazino platforması ilə vaxtınızı daha səmərəli və maraqlı keçirin. Saytın canlı kazino bölməsi istifadəçilərə fərqli bir dünya təklif edir. Burada canlı dilerli kazino oyunlarının hər bir növünü sınaqdan keçirə bilərsiniz. Krupyelərin peşəkarlığı oyunun dinamikasını və marağını artırır. Müntəzəm olaraq yenilənən oyun siyahısı cansıxıcılığa yol vermir. Hesabınızı artırmaq üçün onlarla fərqli və etibarlı üsul mövcuddur. Qazanılan pullar cəmi bir neçə dəqiqə ərzində şəxsi hesabınıza köçürülür. Aktiv fəaliyyətinizə görə fərdi bonuslar və hədiyyələr qazana bilərsiniz. Dəstək xidməti həm çat, həm də e-poçt vasitəsilə kömək göstərir. 1xbet ailəsinə qoşulun və böyük uduşlar üçün ilk addımı atın. onlayn kazino

  • 砂岩白丘

    我一直梦想, 看到你们相册那样的地方。真棒。

  • 城市地標

    我喜欢, 这里分享真实经验。你的项目 就是 属于这里的。请继续。

  • 宗教地標

    我热爱这样的想法, 去那么多国家。真的很鼓舞。

  • 觀景高地

    能感受到热爱。继续保持 感受。

  • 最佳季節

    我关注这样的资源, 写得很实在。你的网站 就是 属于这里的。加油。

  • 1

    1

  • 1

    1

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

    1

日历

2026年07月

   1234
567891011
12131415161718
19202122232425
262728293031 

文章目录

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