第十章 围绕p()与(*p)()的争论

 

  对于一个函数:

void func(void);

我们通常可以定义一个这样的函数指针指向它:

void (*p)(void) = func;

通过p调用func时,通常有两种写法:

p();或者(*p)();

 围绕这两种写法,当初C89制定的时候曾经有过争论。(*p)();是一种旧式的规定,旧式规定圆括号左边必须具有“函数”类型,如果是指向函数的指针,那么必须加上*声明符。但C89不再把圆括号的左边限定为“函数”类型,而是一个后缀表达式。那么问题就来了,如果p的值是函数地址,那么*号就是声明符,但如果p指向的内容是函数地址,*号就得被看作运算符了。同一种形式会有两种解释,这是一个矛盾。不仅函数调用如此,指向数组的指针也存在这种矛盾。编译器为了处理这种情况得增加代码,效率自然就降低了。争论的最后结果是谁也不能把对方完全说服,于是就干脆两种都支持了。笔者认为应该抛弃旧式的规定,p();这种形式简洁明了,又符合函数的一般形式,何乐而不为?


        第八章练习的答案,同时给出用typedef的分解方法:


int (*(*func)[5][6])[7][8];

func是一个指向数组的指针,这类数组的元素是一个具有5X6个int元素的二维数组,而这个二维数组的元素又是一个二维数组。

typedef int (*PARA)[7][8];
typedef PARA (*func)[5][6];


int (*(*(*func)(int *))[5])(int *);

func是一个函数指针,这类函数的返回值是一个指向数组的指针,所指向数组的元素也是函数指针,指向的函数具有int*形参,返回值为int。

typedef int (*PARA1)(int*);
typedef PARA1 (*PARA2)[5];
typedef PARA2 (*func)(int*);

int (*(*func[7][8][9])(int*))[5];

func是一个数组,这个数组的元素是函数指针,这类函数具有int*的形参,返回值是指向数组的指针,所指向的数组的元素是具有5个int元素的数组。

typedef int (*PARA1)[5];
typedef PARA1 (*PARA2)(int*);
typedef PARA2 func[7][8][9];

《Learning Opencv3》第十章 滤波和卷积 第十章 滤波和卷积(一) 文章目录第十章 滤波和卷积(一)一、卷积二、阈值化操作2.1 阈值化2.2 Otsu算法2.3 自适应阈值三、平滑(模糊)3.1 均值滤波(box filter)3.2 均值滤波(Median filter)3.3 高斯噪声(Gaussian filter)3.4 双边滤波(Bilateral filter)四、导数(Deriviative)和梯度(Gradient)4.... 阅读详情

相关推荐

第十章 进程

现代操作系统通过多任务处理实现同时运行多个程序的错觉,内核利用进程管理任务切换。系统启动时,内核运行init进程,进而启动系统服务。进程可以创建子进程,内核通过PID等标识符管理进程信息。常用命令如ps、top、jobs等用于查看和管理进程。ps命令可显示进程的PID、TTY、CPU时间等信息,top命令则动态显示进程状态和资源使用情况。进程状态包括运行、睡眠、停止等,优先级和资源占用情况也通过命令输出展示。

qq_43010954的博客 808

第十章 围绕p()与(*p)()的争论

        对于一个函数:void func(void);我们通常可以定义一个这样的函数指针指向它:void (*p)(void) = func;通过p调用func时,通常有两种写法:p();或者(*p)(); 围绕这两种写法,当初C89制定的时候曾经有过争论。(*p)();是一种旧式的规定,旧式规定圆括号左边必须具有“函数”类型,如果是指向函数的指针,那么必须加上*声明符。但C89不再把圆括

6697

【Python高级编程】第十章:量化金融与算法交易

摘要:本文系统阐述Python在量化金融与算法交易领域的核心技术与实践应用,深入解析Backtrader、Zipline等回测框架,Pandas结合TA-Lib的高频数据清洗方法,以及VaR风险计算模型。通过加密货币套利策略、股票市场因子挖掘等应用场景,详细展示用ccxt+Backtrader实现跨交易所套利机器人的完整案例。提供Docker与Google Colab可复现环境,对比传统策略与优化策略的性能差异,并结合Gartner技术曲线分析各领域成熟度与发展趋势,助力读者掌握量化金融与算法交易的关键技术

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1438

C语言*p、p,&p的区别,**p的含义

C语言*p、p,&p的区别,**p的含义 指针的定义: 指向地址的变量 *p,p,&p的区别 (1) p是一个指针变量的名字,表示此指针变量指向的内存地址。 (2)*p是指p指针指向的地址里的数据。 (3)&p是取p得地址(p本身就是一个地址,但同时也是一个变量。我认为可以这么理解,p是一个变量,他有自己的内存地址,同时p这个变量存储的也是一个地址) 这个程序直观的显示了他们之间的关系 **p的含义 举个例子 int **p :二级指针,表示p所指向的地址里面存放的是一

独自莫凭欗的博客 3万+

ESP32 CAM使用教程(入门级)

串口被占用,可以关闭其他使用到串口的界面;先将手机也连上wifi,然后使用手机浏览器打开这个IP地址,注意手机连接的wifi需要和开发板的wifi一致,也就是程序里自己修改的那个wifi,否则无法打开IP地址;将开发板连接到电脑,点击点击工具→端口,然后选择自己实际接的COM口,不清楚COM口的可以打开电脑设备管理器查看一下,插拔设备看看哪个COM口会刷新就是哪个COM口;安装好esp32库之后,点击工具→开发板→esp32→AI Thinker ESP32-CAM,型号要仔细找找,不要选错了;

qq_34426854的博客 2万+

Keystone变换(4)MATLAB仿真

关于Keystone变换三种方法(DFT-IFFT法、Sinc插值法和Chirp-Z法)的仿真

qq_45846079的博客 1570

*p 和&p区别

*p 和 &p 是在C语言中用于处理指针的两种不同操作。

weixin_36888745的博客 5525

EDA开源仿真工具verilator入门4:访问函数介绍

访问函数(Visitor Function)是verilator算法实现的主要工作方式之一,本节将介绍一下访问函数。

fangfanglovezhou的博客 1076

(int*)&p、void(*p)()、(*p)()都是什么意思?

①(int*)&p 表示 将p指针的地址,即&p,强制转换为指向int类型数据的指针 ②void(*p)() 表示定义一个指针变量p,这个指针指向的一个函数,这个函数的参数和返回值都是void ③(*p)() 表示对这个指针变量p指向的函数的调用 ...

yyjshang的博客 3888

用 Python 和 uiautomation 实现微信批量发送

思路是这样,将要发送的人员名单(包括称呼)以及发送内容都维护到Excel里,程序运行时读取Excel里内容,自动搜索人员姓名(微信昵称或备注名),填入要发送的内容,拼接上称呼(如果需要的话)自动点击发送,这样轮巡直至名单人员全部发送完成。、

jankingdom的专栏 1471

jemalloc实战:5分钟搞定C程序内存泄漏检测(附PDF报告生成技巧)

本文详细介绍了使用jemalloc的heap profiling功能快速检测C/C++程序内存泄漏的实战方法。通过预编译库和LD_PRELOAD注入,无需修改代码即可启动低开销剖析,并利用jeprof工具进行深度分析和生成可视化PDF报告,帮助开发者高效定位线上或开发环境中的内存问题。

i3j4k5的博客 225

第十章 围绕p()与(*p)()的争论- -

        对于一个函数:void func(void); 我们通常可以定义一个这样的函数指针指向它:void (*p)(void) = func; 通过p调用func时,通常有两种写法: p();或者(*p)(); 围绕这两种写法,当初C89制定的时候曾经有过争论。(*p)();是一种旧式的规定,旧式规定圆括号左边必须具有“函数”类型,如果是指向函数的指针,那么必须加上*声明符。但C...

weixin_33874713的博客 94

一篇文章足够你学习Bluez,提供史上最全的Bluez教程,让你告别Bluez从入门到放弃

Bluez是真的难,说“入门到放弃”真的毫不夸张,Bluez的学习曲线陡峭,要求对Linux 系统/驱动概念、D-Bus 通信和蓝牙协议都有要求,加上网络上其实没有一个完整的介绍Bluez系列的文档,所以不管是蓝牙初学者还是蓝牙从业人员,都有不小的难度。

朝气蓬勃 2539

第十章个人总结

10.2使用函数gets(),从键盘输入一个带有空格的人名,然后把它显示在屏幕上 #include <stdio.h> #define N 12 int main() { char name[N]; printf("Enter your name:"); gets(name); printf("Hello %s!\n",name); return 0; } 字符指针版本 #include <stdio.h> #define N 12 int main() .

qq_46867758的博客 436

越野换了逐飞的ips200pro的屏幕后代码烧录中报错: “Cannot initialize device connection” 和 “Flashing failed” ...如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1150

CANoe如何实现TLS协议

TLS,Transport Layer Security,传输层安全协议。是在传输层和应用层之间,为了保证应用层数据能够安全可靠地通过传输层传输且不会泄露的安全防护。

jasonj333 1161

《真象还原》读书笔记——第十章 输入输出系统

多线程访问公共资源时出问题的原因是产生了竞争条件,也就是多个任务同时出现在自己的临界区。信号量的初值代表是信号资源的累积量,也就是剩余量,若初值为 1 的话,它的取值就只能为 0 和 1,这便称为。时(当然这也属于线程合作),为了保证结果正确,必然要用一套额外的机制来控制它们的工作步调,也就是使线程们。信号量就是个计数器,它的计数值是自然数,用来记录所积累信号的数量。操作来表示信号量的减、增,这两个都是荷兰语中的单词的缩写。唤醒已阻塞的线程是由别的线程,通常是锁的持有者来做的。

1710orange的温馨小窝 1046

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

第十章

‘’’ 文件读写 open函数 * open(name[, mode[, buffering]]) ‘’’ help(open) print open.doc f = open(‘somefile.txt’, ‘w’) 每次调用f.write()的时候,数据都会以追加的方式写入文件中 f.write(‘Hello’) f.write(‘World’) f.close() f = open(‘somefile.txt’, ‘r’) 读5个字节的字符 print f.read(5)

weixin_52885548的博客 594

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

《C Primer Plus》(第六版)第十章:数组和指针|复习题与编程练习答案参考

中的一个拷贝函数把该数组中的数据拷贝至另一个二维数组中(因为二维数组是数组的数组,所以可以使用处理一维数组的拷贝函数来处理数组中的每个子数组)。该函数本身不需要修改,只需要选择合适的实际参数(实际参数不需要是数组名和数组大小,只需要是数组元素的地址和待处理元素的个数)。在C语言中,当传递二维数组到函数时,您需要指定第一个维度的大小为星号(*)或者省略第一个维度的大小,同时数组的第二维(列数)必须明确指定。类型数组中最大值和最小值的差值,并在一个简单的程序中测试该函数。在一个简单的程序中测试该函数。

Lown_1的博客 634

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

第十章 数组与指针( C primer plus)

第十章 数组与指针 1.数组长度建议定义为宏。由于编译器不检查数组下标的合法性,这样可减少下标越界错误。 2.只读数组声明最前面加const,且同时必须初始化。 3.数组属于自动存储类,数组元素的值不初始化时是不定的;部分初始化,后面默认为0;多初始化出错。 4.可以让数组长度空着,由编译器根据初始化的数值的个数确定数组大小。获取数组长度方法:int a;length=sizeof(a)/sizeof(a[0]);缺点:初始化的元素个数有误时,不易发现。 4.C99特性:int a[4]={1,[2]=2,

酒千殇的博客 222

vue学习第十章(组件开发)

🎉🎉🎉欢迎来到我的博客,我是一名自学了2年半前端的大一学生,熟悉的技术是JavaScript与Vue.目前正在往全栈方向前进, 如果我的博客给您带来了帮助欢迎您关注我,我将会持续不断的更新文章!!!🙏🙏🙏 文章目录1. 组件的基本使用1.1 创建组件构造器对象1.2 注册组件1.3 使用组件2. 全局组件和局部组件2.1 全局组件2.2 局部组件3. 父组件和子组件的区别4. 注册组件的语法糖5. 组件模板的分离写法5.1 script标签5.2 template标签6. 组件的数据6.1 存放问题6.

雨溪的博客 1222

第十章 JavaScript的应用

HTML 定 义 网 页 的 内 容,CSS 定 义 网 页 的 表 现, JavaScript则定义特殊的行为。JavaScript是一种脚本语 言,脚本语言的特点是简单、易学,即使是程序设计新手也 可以非常容易地使用JavaScript进行简单的编程。JavaScript作为一种直译式脚本语言,是一种动态类 型、弱类型、基于原型的语言,内置支持类型。它的解释器 称为JavaScript引擎,为浏览器的一部分,广泛用作客户端 的脚本语言,最早是在 HTML网页上使用,用来给 HTML 网页增加动态效果。

2301_78694366的博客 776
上一篇: 第九章 指针与const
下一篇: 再再论指针----篇首语
cubelee
博客等级 码龄15年 4粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值