首页 > 其他分享 >C语言int * (* (*fp1) (int) ) [10]声明是啥意思呢?

C语言int * (* (*fp1) (int) ) [10]声明是啥意思呢?

时间:2024-01-11 13:16:49浏览次数:36  
标签:10 const 指向 int C语言 char 一个 指针

int a
a一个int类型的变量

int* p
p是一个指针变量,指向int类型对象

const关键字,除非右边是一个类型说明符,那么它作用于该类型说明符,否则作用于左边的符号

const int * p
这里const右边是int类型说明符,所以作用于int,a是一个指针变量,指向const的int类型变量
*p=1这样使用将会报错,因为指向的那个变量是只读的,无法修改

int const * p
这里的const右边是 * 符号,所以const也是作用于左边的int符号,结果同上

int * const p
这里的这里的const右边是p,所以const是作用于左边的*符号
*p=1没问题;p=&a 错误,因为const作用的是*符号,表示该指针变量是只读的,无法修改

 

再看一些其他的

char ** p1;                    //       p1是指针,指向一个指针x,x指向char
const char **p2;               //    p2是指针,指向一个指针x,x指向一个const char   
char * const * p3;             //   p3是指针,指向一个const指针x,x指向char
const char * const * p4;       //  p4是指针,指向一个const指针x,x指向一个const char    
char ** const p5;              //  p5是const指针,指向一个指针x,x指向一个 char
const char ** const p6;        // p6是const指针,指向一个指针x,x指向一个const char
char * const * const p7;       // p7是一个const指针,指向一个const指针x,x指向一个char
const char * const * const p8; //  p8是一个const指针,指向一个const指针x,x指向一个const char

 

再看些其他简单的声明

int p[3]
p是一个数组,数组的每一个元素是int类型

int*p[3]
p是一个数组,数组的没一个元素是int*指针类型

int(*p)[3]
p是一个指针,指针指向一个int[3]数组,数组的每一个元素是int类型

int (*p)()
p是一个指针,指针指向一个返回int类型的函数

上面这些简单的声明,都比较清楚,基本一眼就能看出来

下面来一个复杂的

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

有一个简单的识别规则,从标识符开始,往右边结合,遇到左括号再向左结合,当前括号结束以后,再跳到外层的括号从新开始一轮的结合

1、标识符fp1

2、右边没有其他运算符,只有一个)括号,所以向左结合 遇到一个*,说明这是一个指针,指向哪里呢?

3、再往左只有一个(括号 跳到外面,继续往由 看到一个(int) ,说明这是一个函数,所以结合第2步 这是一个指向函数的指针,函数参数是int类型

4、往右又是一个括号,则往左结合,是一个*号,说明该函数返回的是一个指针,那么返回的指针指向哪里呢?

5、往左遇到(,再跳到外面,往右结合,说明这个指针指向一个10个元素的数组,数组的元素是什么呢?

6、往左结合,看到一个* ,说明数组元素是指针,并且指向的是int类型

所以总结,这是一个函数指针,函数返回一个指向含有10个元素的数组指针,并且该数组元素都是int*类型

 

同样的方法,看下面几个例子

int *( *( *arr[5])())();  是一个指针数组,每一个指针指向函数,函数返回的也是一个指针,指针指向的又是一个函数,函数又返回的是指针

float ( * ( *b()) [] )();  是一个函数,该函数返回一个指针,指针指向的是一个数组,数组的每一个元素又是一个指针,指向一个返回float的函数

void * ( *c) ( char, int (*)());  是一个指针,指针指向一个函数,并返回一个void *指针,函数的参数有2个,一个是char类型,另一个是函数指针(函数返回的是int类型,函数没有参数)

void ** (*d) (int &, char **(*)(char *, char **)); 是一个指针,指针指向一个函数,函数返回的是一个指针,返回的指针指向一个void*指针,函数有2个参数,一个是引用类型int ,
另一个参数是是函数指针,被指的函数,有两个参数,一个是char*, 另一个是char**, 函数返回char**

float ( * ( * e[10]) (int &) ) [5]; 是一个数组,数组的每一个元素是指针,指针指向一个函数,函数参数是int& ,函数返回的是又是一个指针,指针指向数组,数组每一个元素是float类型

   

标签:10,const,指向,int,C语言,char,一个,指针
From: https://www.cnblogs.com/fuyun2000/p/17958328

相关文章

  • (△△△)给定 n 个字符串,请对 n 个字符串按照字典序排列。 数据范围: 1 \le n \le 100
    描述给定n个字符串,请对n个字符串按照字典序排列。数据范围:1\len\le1000\1≤n≤1000,字符串长度满足1\lelen\le100\1≤len≤100输入描述:输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。输出描述:数据......
  • IntelliJ IDEA Debug模式下结束后继续执行代码问题
    1.默认的配置默认的Debug模式下点击Stop后会继续执行代码。2.设置不继续执行后续代码Preferences->Build,Execution,Deployment->Debugger找到Java那一栏下边可以看到Killthedebugprocessimmediately选项,勾选后点击确定就可以了。或是直接在设置搜索框里输入Kil......
  • P4103 [HEOI2014] 大工程 题解
    题目链接:大工程先考虑只有一次查询,很显然我们可以暴力树上dp处理出答案。对于每个节点而言,有:容易看出类似点分治逐个遍历子树计算前面一堆子树对后面子树的贡献思想,我们可以很容易的知道:对于路径总和,显然多了一段新的贡献,这段贡献为当前关键点和前面点多的一段\(2\)号路......
  • nuxt构建失败:if (codePoint 》= 0x3_00 && codePoint (= 0x3_6F) { SyntaxError: In
     错误消息指的是在Node.js中使用了数字分隔符,12.8.1之前的Node版本不支持这种做法。0x3_00此处使用数字分隔符_。如果没有它,符号看起来就像0x300。有关支持此功能的Node.js版本的列表,请参阅https://node.green/#ES2021-features--numeric-separators。需要将node:10-alpin......
  • 输入一个整数,将这个整数以字符串的形式逆序输出 程序不考虑负数的情况,若数字含有0,则逆
    描述输入一个整数,将这个整数以字符串的形式逆序输出程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001数据范围:0\len\le2^{30}-1\0≤n≤230−1输入描述:输入一个int整数输出描述:将这个整数以字符串的形式逆序输出点击查看代码#include<i......
  • MURD1060-ASEMI快恢复TO-252封装二极管MURD1060
    编辑:llMURD1060-ASEMI快恢复TO-252封装二极管MURD1060型号:MURD1060品牌:ASEMI封装:TO-252平均正向整流电流(Id):10A最大反向击穿电压(VRM):600V产品引线数量:3产品内部芯片个数:2产品内部芯片尺寸:72MIL峰值正向漏电流:<10ua恢复时间:>2000ns正向浪涌电流:550A正向压降:1.7V恢复时间:35ns最大正向电......
  • 用试除法来判断100~200之间的素数
    include<stdio.h>include<string.h>include<math.h>intmain()//输出1-100以内的素数(试除法)//{//inta;//intcount=0;//for(a=100;a<=200;a++)//{// intj;//for(j=2;j<a;j++)//{//if(a%j0)// break;//}//if(aj)//{// count++;//printf(&......
  • MURD1060-ASEMI快恢复TO-252封装二极管MURD1060
    编辑:llMURD1060-ASEMI快恢复TO-252封装二极管MURD1060型号:MURD1060品牌:ASEMI封装:TO-252平均正向整流电流(Id):10A最大反向击穿电压(VRM):600V产品引线数量:3产品内部芯片个数:2产品内部芯片尺寸:72MIL峰值正向漏电流:<10ua恢复时间:>2000ns正向浪涌电流:550A正向压降:1.7V恢复时间......
  • 彻底改变你的代码:JavaScript linter—Oxlint
    作为开发人员,总是在寻找能够简化工作流程并提高工作效率的工具。Oxlint是一个用Rust编写的JavaScriptlinter,现在提供了可以替代ESLint的新方案,其性能比ESLint提升了50-100倍。在本文中,将学习如何将Oxlint集成到开发流程中,充分利用其速度和效率。了解OxlintOxc(TheO......
  • 暂停win10和win11系统自动更新
    regedit打开注册表计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings新建DWORD(32位)值FlightSettingsMaxPauseDays(改为十进制值)值的单位为天4.最后打开设置Windows更新修改暂停更新......