社区
C语言
帖子详情
int (*a[10])(int) 怎么理解?
大雨
2012-01-11 09:21:01
int (*a[10])(int);
请问大侠,这种比较复杂的写法,应该怎么解读啊?
如果能举个类似的例子更好了,多谢。
...全文
1782
31
打赏
收藏
int (*a[10])(int) 怎么理解?
int (*a[10])(int); 请问大侠,这种比较复杂的写法,应该怎么解读啊? 如果能举个类似的例子更好了,多谢。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
31 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
猪头小哥
2012-01-14
打赏
举报
回复
a是一个含有10个元素的数组,而这每个元素又是一个函数指针类型,而这个函数的参数是int 返回值也是int。
猪头小哥
2012-01-14
打赏
举报
回复
哥们,你好像弄错了吧~
[Quote=引用 4 楼 programmingring 的回复:]
a是个数组,每个元素是个返回值为int,一个参数为int的函数指针
[/Quote]
Mark0904
2012-01-14
打赏
举报
回复
[Quote=引用 30 楼 tianyahaijiaozd 的回复:]
注意指针数组和数组指针的区别:
int (*a[10])(int):a是这样一个数组,它有十个元素,每个元素都是一个函数指针,所指向的函数是带一个int参数返回值也是int。
int (*a)[10](int):a是一个函数指针,它所指向的函数是带一个int参数返回值是一个有10个int元素的数组。
[/Quote]
正解
dq
2012-01-14
打赏
举报
回复
注意指针数组和数组指针的区别:
int (*a[10])(int):a是这样一个数组,它有十个元素,每个元素都是一个函数指针,所指向的函数是带一个int参数返回值也是int。
int (*a)[10](int):a是一个函数指针,它所指向的函数是带一个int参数返回值是一个有10个int元素的数组。
lovzm
2012-01-14
打赏
举报
回复
3楼正解
函数指针数组
大家都搬出资料来啦,Mark下,再温习温习。
平凡的思想者
2012-01-14
打赏
举报
回复
int (*a[10])(int)为函数指针数组,数组大小为10,函数原型如:int test(int x)。
lusedeya6
2012-01-14
打赏
举报
回复
右左法则BAIDU下
lusedeya6
2012-01-14
打赏
举报
回复
int * (* (*fp1) (int) ) [10];
阅读步骤:
1. 从变量名开始 -------------------------------------------- fp1
2. 往右看,什么也没有,碰到了),因此往左看,碰到一个* ------ 一个指针
3. 跳出括号,碰到了(int) ----------------------------------- 一个带一个int参数的函数
4. 向左看,发现一个* --------------------------------------- (函数)返回一个指针
5. 跳出括号,向右看,碰到[10] ------------------------------ 一个10元素的数组
6. 向左看,发现一个* --------------------------------------- 指针
7. 向左看,发现int ----------------------------------------- int类型
总结:fp1被声明成为一个函数的指针,该函数返回指向指针数组的指针.
lusedeya6
2012-01-14
打赏
举报
回复
定义一个包含10个指向返回整形的带有int型参数的函数的指针的数组
kchenapple
2012-01-13
打赏
举报
回复
int (*a[10])(int);
a数组包含10个 返回值int ,参数int 这样的函数。
墨鱼精
2012-01-13
打赏
举报
回复
原型:int (*a[10])(int);
换种写法:int (int) (*a[10]);
整个作为一个类型(函数类型) 指针数组
总的意思是:定义一个指向 int (int)类型函数的指针数组
小班得瑞
2012-01-12
打赏
举报
回复
这种声明的方式,在《C和指针》一书中给出的方法是使用推断的方法:下标操作优先级高于解引用,那么a先与[]结合,然后再是*,所以a的类型为一个“元素为某种类型的”指针数组,根据int (*a[10])(int)可以推断出数组a里元素的类型为函数指针,最后,它所指向的函数的返回值为int。
wang_bird
2012-01-12
打赏
举报
回复
int (*a[10])(int);
a是一个10个元素的数组,其每一个元素是指向返回int值的函数的指针。
Frog1228
2012-01-12
打赏
举报
回复
[Quote=引用 13 楼 mjjackey 的回复:]
函数指针数组。函数是int fun(int),参数为int ,返回值为int,由指向这个函数的指针构成10个元素的数组。2楼是高手,多看看他的博客。
[/Quote]
从里往外剥,替换。
帅得不敢出门
2012-01-12
打赏
举报
回复
右左法则。
Ever_lover
2012-01-12
打赏
举报
回复
和int *a(int)没什么区别,只是这一个返回一个int类型的指针,也就是说返回一个指针指向int类型而楼主是返回多个 也就是个数组
Frog1228
2012-01-12
打赏
举报
回复
函数指针数组。函数是int fun(int),参数为int ,返回值为int,由指向这个函数的指针构成10个元素的数组。2楼是高手,多看看他的博客。
新屿
2012-01-12
打赏
举报
回复
右左法则:首先从最里面的圆括号看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明解析完毕。
笔者要对这个法则进行一个小小的修正,应该是从未定义的标识符开始阅读,而不是从括号读起,之所以是未定义的标识符,是因为一个声明里面可能有多个标识符,但未定义的标识符只会有一个。
现在通过一些例子来讨论右左法则的应用,先从最简单的开始,逐步加深:
int (*func)(int *p);
首先找到那个未定义的标识符,就是func,它的外面有一对圆括号,而且左边是一个*号,这说明func是一个指针,然后跳出这个圆括号,先看右边,也是一个圆括号,这说明(*func)是一个函数,而func是一个指向这类函数的指针,就是一个函数指针,这类函数具有int*类型的形参,返回值类型是int。
int (*func)(int *p, int (*f)(int*));
func被一对括号包含,且左边有一个*号,说明func是一个指针,跳出括号,右边也有个括号,那么func是一个指向函数的指针,这类函数具有int *和int (*)(int*)这样的形参,返回值为int类型。再来看一看func的形参int (*f)(int*),类似前面的解释,f也是一个函数指针,指向的函数具有int*类型的形参,返回值为int。
int (*func[5])(int *p);
func右边是一个[]运算符,说明func是一个具有5个元素的数组,func的左边有一个*,说明func的元素是指针,要注意这里的*不是修饰func的,而是修饰func[5]的,原因是[]运算符优先级比*高,func先跟[]结合,因此*修饰的是func[5]。跳出这个括号,看右边,也是一对圆括号,说明func数组的元素是函数类型的指针,它所指向的函数具有int*类型的形参,返回值类型为int。
int (*(*func)[5])(int *p);
func被一个圆括号包含,左边又有一个*,那么func是一个指针,跳出括号,右边是一个[]运算符号,说明func是一个指向数组的指针,现在往左看,左边有一个*号,说明这个数组的元素是指针,再跳出括号,右边又有一个括号,说明这个数组的元素是指向函数的指针。总结一下,就是:func是一个指向数组的指针,这个数组的元素是函数指针,这些指针指向具有int*形参,返回值为int类型的函数。
int (*(*func)(int *p))[5];
func是一个函数指针,这类函数具有int*类型的形参,返回值是指向数组的指针,所指向的数组的元素是具有5个int元素的数组。
要注意有些复杂指针声明是非法的,例如:
int func(void) [5];
func是一个返回值为具有5个int元素的数组的函数。但C语言的函数返回值不能为数组,这是因为如果允许函数返回值为数组,那么接收这个数组的内容的东西,也必须是一个数组,但C语言的数组名是一个右值,它不能作为左值来接收另一个数组,因此函数返回值不能为数组。
int func[5](void);
func是一个具有5个元素的数组,这个数组的元素都是函数。这也是非法的,因为数组的元素除了类型必须一样外,每个元素所占用的内存空间也必须相同,显然函数是无法达到这个要求的,即使函数的类型一样,但函数所占用的空间通常是不相同的。
作为练习,下面列几个复杂指针声明给读者自己来解析,答案放在第十章里。
int (*(*func)[5][6])[7][8];
int (*(*(*func)(int *))[5])(int *);
int (*(*func[7][8][9])(int*))[5];
实际当中,需要声明一个复杂指针时,如果把整个声明写成上面所示的形式,对程序可读性是一大损害。应该用typedef来对声明逐层分解,增强可读性,例如对于声明:
int (*(*func)(int *p))[5];
可以这样分解:
typedef int (*PARA)[5];
typedef PARA (*func)(int *);
新屿
2012-01-12
打赏
举报
回复
摘录别人的,或许对你有用:
右左法则:首先从最里面的圆括号看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明解析完毕。
笔者要对这个法则进行一个小小的修正,应该是从未定义的标识符开始阅读,而不是从括号读起,之所以是未定义的标识符,是因为一个声明里面可能有多个标识符,但未定义的标识符只会有一个。
现在通过一些例子来讨论右左法则的应用,先从最简单的开始,逐步加深:
int (*func)(int *p);
首先找到那个未定义的标识符,就是func,它的外面有一对圆括号,而且左边是一个*号,这说明func是一个指针,然后跳出这个圆括号,先看右边,也是一个圆括号,这说明(*func)是一个函数,而func是一个指向这类函数的指针,就是一个函数指针,这类函数具有int*类型的形参,返回值类型是int。
int (*func)(int *p, int (*f)(int*));
func被一对括号包含,且左边有一个*号,说明func是一个指针,跳出括号,右边也有个括号,那么func是一个指向函数的指针,这类函数具有int *和int (*)(int*)这样的形参,返回值为int类型。再来看一看func的形参int (*f)(int*),类似前面的解释,f也是一个函数指针,指向的函数具有int*类型的形参,返回值为int。
int (*func[5])(int *p);
func右边是一个[]运算符,说明func是一个具有5个元素的数组,func的左边有一个*,说明func的元素是指针,要注意这里的*不是修饰func的,而是修饰func[5]的,原因是[]运算符优先级比*高,func先跟[]结合,因此*修饰的是func[5]。跳出这个括号,看右边,也是一对圆括号,说明func数组的元素是函数类型的指针,它所指向的函数具有int*类型的形参,返回值类型为int。
int (*(*func)[5])(int *p);
func被一个圆括号包含,左边又有一个*,那么func是一个指针,跳出括号,右边是一个[]运算符号,说明func是一个指向数组的指针,现在往左看,左边有一个*号,说明这个数组的元素是指针,再跳出括号,右边又有一个括号,说明这个数组的元素是指向函数的指针。总结一下,就是:func是一个指向数组的指针,这个数组的元素是函数指针,这些指针指向具有int*形参,返回值为int类型的函数。
int (*(*func)(int *p))[5];
func是一个函数指针,这类函数具有int*类型的形参,返回值是指向数组的指针,所指向的数组的元素是具有5个int元素的数组。
要注意有些复杂指针声明是非法的,例如:
int func(void) [5];
func是一个返回值为具有5个int元素的数组的函数。但C语言的函数返回值不能为数组,这是因为如果允许函数返回值为数组,那么接收这个数组的内容的东西,也必须是一个数组,但C语言的数组名是一个右值,它不能作为左值来接收另一个数组,因此函数返回值不能为数组。
int func[5](void);
func是一个具有5个元素的数组,这个数组的元素都是函数。这也是非法的,因为数组的元素除了类型必须一样外,每个元素所占用的内存空间也必须相同,显然函数是无法达到这个要求的,即使函数的类型一样,但函数所占用的空间通常是不相同的。
作为练习,下面列几个复杂指针声明给读者自己来解析,答案放在第十章里。
int (*(*func)[5][6])[7][8];
int (*(*(*func)(int *))[5])(int *);
int (*(*func[7][8][9])(int*))[5];
实际当中,需要声明一个复杂指针时,如果把整个声明写成上面所示的形式,对程序可读性是一大损害。应该用typedef来对声明逐层分解,增强可读性,例如对于声明:
int (*(*func)(int *p))[5];
可以这样分解:
typedef int (*PARA)[5];
typedef PARA (*func)(int *);
薛定谔之死猫
2012-01-11
打赏
举报
回复
摆明了是给编译器看的,不是给人看的,和ShellCode没什么两样,不用太在乎~
加载更多回复(11)
YOLOv8目标检测实战:TensorRT加速部署
PyTorch版的YOLOv8是先进的高性能实时目标检测方法。 TensorRT是针对英伟达GPU的加速工具。本课程讲述如何使用TensorRT对YOLOv8目标检测进行加速和部署。采用改进后的tensorrtx/yolov8的代码,使用TensorRT API构建优化推理引擎支持在GPU上端到端TensorRT加速部署,包括预处理(图像resize, BGR->RGB,归一化)、网络推理、后处理(非极大抑制) 均在GPU上执行支持FP16和
INT
8量化加速提供C++和Python的TensorRT加速命令接口分别在Windows和Ubuntu系统上做YOLOv8的TensorRT加速和部署演示支持图片、图片文件夹、视频文件的TensorRT的加速推理提供YOLOv8的TensorRT加速部署代码和代码解析文档实测推理速度提高3倍以上,采用
INT
8量化加速后推理速度更快。RTX 3060 GPU上端到端处理速度约2.5毫秒,
INT
8量化加速后推理速度可小于2毫秒。课程内容包括:原理篇(YOLOv8网络架构与组件、TensorRT基础、TensorRT
INT
8量化、CUDA编程方法)、实践篇(Windows和Ubuntu系统上的TensorRT加速和
INT
8量化部署演示)、代码解析篇(YOLOv8的TensorRT加速的代码解析) 。本课程提供YOLOv8的TensorRT加速部署代码和代码解析文档。
c语言中
int
*a,
int
a和
int
* a什么区别?
int
*a指的是定义一个指向
int
类型数据的指针a,
int
a指的是定义一个整数变量a,
int
* a跟
int
*a是一样的,只是
int
*a更严谨, 比如,
int
*a,b; 只有a是指针变量
int
* a,b; 容易让人觉得a和b都是指针 #include <stdio.h> void huhuan(
int
a,
int
b) { pr
int
f("%d\n", a...
c语言中
int
a什么意思,c语言中
int
*a,
int
a和
int
* a什么区别?
int
*a指的是定义一个指向
int
类型数据的指针a,指针
int
a指的是定义一个整数变量a,
int
* a跟
int
*a是同样的,只是
int
*a更严谨,好比,
int
*a,b; 只有a是指针变量
int
* a,b; 容易让人以为a和b都是指针code#include void huhuan(
int
a,
int
b) {pr
int
f("%d\n", a); //5pr
int
f("%d...
C++中
int
*a;
int
&a;
int
& *a;
int
* &a
C++中指针和应用的不同混用方式往往具有截然不同的语义,所以这里详细地对几种指针和引用的混用方式进行区分,指针和引用的混用常见的如下面几种:
int
i;
int
*a = &i; //这里a是一个指针,它指向变量i
int
&b = i; //这里b是一个引用,它是变量i的引用(别名)
int
* &c = a; //这里c是一个引用,它是指针a的引用 ...
int
a,
int
*a,
int
**a,
int
(*a)[
10
] 和
int
*a[
10
] 的区别,数组引用
首先说一下以下性质 a)
int
a;表示一个内存空间,这个空间用来存放一个整数(
int
); b)
int
* a;表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放整数的空间,即a)中提到的空间; c)
int
** a;表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放指针的空间,并且指向的这个空间中的指针,指向一个整数。也简单的说,指向了一个b)中提到的空间;...
C语言
69,373
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章