C/C++ 复杂的声明

入门阶段,看见类似void * (*(*fp1)(int))[10];的复杂声明,晕乎。直接略过,这种复杂的东东,不应该是入门者需要去学习的知识。

进阶阶段,这种知识就必需得搞得清清楚楚了,不然还等到高阶阶段才学习这个么?


现在,就来带大家了解一下,这类复杂的声明怎么解?

在解之前,先看一个入门的知识点,指针函数作为参数传递。

int func_call(string text) {
	cout << text << endl;
	return 5;
}

void func_pointer(int (*fp)(string)) {
	cout << fp("func_pointer") << endl;
}

void main() {
	int (*fp)(string);//声明函数指针,此函数接受一个字符串参数并返回一个整型
	fp = func_call;
	func_pointer(fp);//将函数指针作为参数传递
}

怎么声明函数指针相信大家都很清楚,现在就来解复杂声明

1. void * (*(*fp1)(int))[10];

2. float (*(*fp2)(int,int,float))(int);

解1:void * (*(*fp1)(int))[10];

(1)包含fp1的最内层小括号是(*fp1):fp1是指针
(2)往(*fp1)右边看是(int),右边是小括号即是函数:指向带有一个int型参数的函数
(3)再往(*fp1)左边看是*,当右边是函数,左边即是函数的返回值:且函数返回一个指针
(4)往(*(*fp1)(int))右边看是[10],右边中括号表示数组:指针指向一个大小为10的数组
(5)再往(*(*fp1)(int))左边看是void *,即是数组的类型:数组类型为void *

好了,把整段话拼出来吧:

fp1是指针,指向带有一个int型参数的函数,且函数返回一个指针,指针指向一个大小为10的数组,数组类型为void *


解2:float (*(*fp2)(int,int,float))(int);

(1)包含fp2的最内层小括号是(*fp2):fp2是指针
(2)往(*fp2)右边看是(int,int,float),右边是小括号即是函数:指向带有3个参数的函数
(3)再往(*fp2)左边看是*,当右边是函数,左边即是函数的返回值:且函数返回一个指针
(4)往(*(*fp2)(int,int,float))右边看是(int),右边小括号表示函数:指针指向带1个整型参数的函数
(5)再往(*(*fp2)(int,int,float))左边看是float,即是函数的返回值:函数返回float

把整段话拼出来:


fp2是指针,指向带有3个参数的函数,且函数返回一个指针,指针指向带1个整型参数的函数,函数返回float


任何复杂的声明都按此方法解,中间的变量名开始,右--左--右--左。编译器也是按此步骤读声明的。


下面代码示例:

typedef void* (*AP)[10];

AP func_fp1(int i) {
	cout<< "func_fp1:" << i << endl;
	AP a = nullptr;
	return a;
}

void main() {
	void * (*(*fp1)(int))[10];
	fp1 = func_fp1;
	(*fp1)(5);
}

声明也使用类型定义会使声明看起来更简单一点

void main() {
	AP (*fp1)(int);
	fp1 = func_fp1;
	(*fp1)(5);
}



float func_f(int i) {
	cout<< "func_f:" << i << endl;
	return 1.0f;
}

typedef float (*FP)(int);

FP func_fp2(int i,int j,float f) {
	cout<< "func_fp2 i:" << i << ", j:" << j << ", f:" << f << endl;

	//float (*fp)(int);
	FP fp;
	fp = func_f;
	return fp;
}

void main() {
	float (*(*fp2)(int,int,float))(int);
	fp2 = func_fp2;
	(*(*fp2)(1,2,3))(4);
}

一样可以用类型定义

void main() {
	FP (*fp3)(int,int,float);
	fp3 = func_fp2;
	(*(*fp3)(5,6,7))(8);
}





从中间开始,即从变量名fp1开始解,(*fp1)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种非常常用的计算机编程语言,也是许多程序员的入门语言。但是在编写程序的过程中,难免会出现一些错误。下面我来讲解如何改正C语言程序中的错误。 首先,我们需要学会阅读并理解错误信息。当程序出现错误时,C语言编译器会输出相应的错误信息,我们可以根据错误信息来定位和解决问题。 其次,检查语法错误。语法错误是编程过程中最常见的错误之一。C语言是一种强类型语言,因此在声明变量、赋值、调用函数等地方都需要遵循一定的语法规则。如果程序中存在与语法规则不符的地方,编译器就会报错。在修复语法错误时,需要仔细检查每个字符、标点符号和代码结构,确保其符合语法要求。 还需要检查逻辑错误。逻辑错误是指程序在运行过程中的输出结果与预期不符。例如,程序计算一个数的平方根,但结果却是负数。这时候我们要检查是否在计算平方根之前没有判断数值是否合法,或者计算过程中是否存在除以0的情况等。 最后,进行调试。调试是指逐行或逐块地运行程序,查找可能出错的地方。在调试过程中,可以使用printf语句输出一些中间结果,以确定程序是否按照预期执行。如果在某个地方出现错误,我们可以通过逐个比较变量的值、条件语句的判断结果等方法来找出错误所在。 总之,改正C语言程序中的错误需要耐心和细心,需要从语法、逻辑和调试等多个方面全面考虑。通过不断的学习和实践,我们可以更好地掌握C语言编程,提高自己的编程能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值