函数

自定义函数的完整写法:


注:

  1. 函数原型与函数定义的头部类似,最后以分号结尾
  2. 函数原型中的参数名称可以省略,只写参数类型
  3. C++中返回值类型不能是数组,但可以是其他任何类型(可以将数组作为结构或对象组成部分返回)

按值传递的机制:
给函数传递变元(参数)时,变元(参数)值不会直接传递给函数,而是先制作变元(参数)值的副/本,存储在栈上,在使这个副本可用于函数,而不是使用初始值

使用数组作为函数实参 1:

#include <iostream>
using namespace std;string valueNames[] = {"体力", "智力", "魅力", "道德", "气质"};
//函数定义
void input(int [], int);
void Print(int [], int);
int main()
{int values[5];input(values, sizeof(values) / sizeof(int));Print(values, 5);return 0;
}
//函数实现
void input(int values[], int length)
{if(length > 5){cout << "数组长度只能是5以内" << endl;return;}for(int i = 0; i < length; i++){cout << valueNames[i] << ":";cin >> values[i];}
}
void Print(int values[], int length)
{for(int i = 0; i < length; i++){cout << valueNames[i] << ":" << values[i] << endl;}
}

注:

  1. 数组作为函数实参时,只传递数组的地址(首地址),并不传递整个数组空间
  2. 当用数组名作为实参调用函数时,数组首地址指针就被传递到函数中

使用数组作为函数实参 2:
使用数组区间的函数

void show(const int *, const int *);
int main()
{int valueArray[] = {90, 56, 67, 89, 100};show(valueArray, valueArray + 4);
}
void show(const int * begin, const int * end)
{for(const int *ptr = begin; ptr <= end; ptr++){cout << *ptr << ",";}
}

使用数组作为函数实参 3:
使用二维数组作参数

#include <iostream>
using namespace std;//函数声明:
void show(const double (*)[5], int);int main()
{double powers[3][5] = {{45, 5, 55, 66, 224},{23, 23, 234, 45, 45},{34, 56, 34, 27, 67}};show(powers, 3);
}//函数实现
void show(const double (*arrs)[5], int length)
{for(int i = 0; i < length; i++){for(int j = 0; j < 5; j++){cout << arrs[i][j] << "\t";}cout << "\n";}
}

函数指针

函数地址:函数的地址是存储其机器语言代码的内存开始地址
好处:可以在不同的时间使用不同的函数

函数指针的声明:

//函数原型
double sum(double, double);
//函数指针声明
double (*ptrSum)(double, double)

注:

  1. 该语句声明了一个指针ptrSum,指向一个函数
  2. double *ptrSum(double, double) 不是函数指针,而是:声明了一个函数ptrSum,返回double *类型

示例:

#include <iostream>
using namespace std;
//函数声明:
int power(int, int);int main()
{//声明函数指针 - ptrPowerint (*ptrPower)(int, int);//让声明的函数指针指向函数,以便调用ptrPower = power;cout << power(3, 4);//cout << (*ptrPower)(3, 4);
}
//函数实现
int power(int num1, int num2)
{int result = 1;for(int i = 0; i < num2; i++){result *= num1;}return result;
}

函数指针应用

使用函数指针实现加减乘除运算:

double addition(double, double)
double subtraction(double, double)
double multiplication(double, double)
double division(double, double)
double (*ptrCalc)(double, double)
#include <iostream>
#include "GzDemo.h"
using namespace std;
//函数声明:
double addition(double, double);//加
double subtraction(double, double);//减
double multiplication(double, double);//乘
double division(double, double);//除
//打印计算结果
void print_result(double(*)(double, double), double, double);
int power(int, int);int main()
{//定义函数指针double (*ptrCalc)(double, double);double num1 = 0, num2 = 0;char op;cout << "请输入两个操作数:";cin >> num1 >> num2;cout << "请输入运算符:";cin >> op;switch(op){case '+'://调用加法函数ptrCalc = addition;break;case '-'://调用减法函数ptrCalc = subtraction;break;case '*'://调用乘法函数ptrCalc = multiplication;break;case '/'://调用除法函数ptrCalc = division;break;}//调用print_result(ptrCalc, num1, num2);
}
//函数实现
double addition(double num1, double num2)
{return num1 + num2;
}
double subtraction(double num1, double num2)
{return num1 - num2;
}
double multiplication(double num1, double num2)
{return num1 * num2;
}
double division(double num1, double num2)
{if(num2 == 0){cout << "除数不能为0!" << endl;}return num1 / num2;
}
//打印计算结果
void print_result(double(*ptrCalc)(double, double), double num1, double num2)
{//调用函数,打印结果double result = ptrCalc(num1, num2);cout << "运算结果为:" << result << endl;
}

注:

  1. C++中可以使用auto ptrFunc = addition;自动推断类型(自动推断类型需要确保变量与初值类型一致)
  2. 可以使用typedef简化声明:typedef double(*ptrCalc)(double, double) ptrCalc ptrFunc;

老九学堂 学习C++ 第六天相关推荐

  1. 老九学堂 学习 C++ 第七、八天

    7.1 内联函数 内联(inline)函数:是C++为提高程序运行速度所做的一项改进:与常规函数的区别不在于编写方式,而在于被调用时的运行机制不同:编译使用函数代码替换 函数调用. 使用建议:如果执行 ...

  2. 老九学堂 学习C++ 第十天

    10继承 10.1 概念: 所谓 "继承(inheritance)" 就是在一个已经存在的类基础上,再建立一个新类 从已有的类派生出新的类,派生类就继承了原有类(基类)的特征,包括 ...

  3. 【老九学堂】【C++】数组与指针

    不知道在通过前面的内容学习后,是否有很多小伙伴都会认为数组和指针是等价的,数组名表示数组的首地址呢?不幸的是,这是一种非常危险的想法,并不完全正确,前面我们将数组和指针等价起来是为了方便大家理解(在大 ...

  4. 老九学堂之分布式设计教材

    老九学堂之分布式设计教材 作者:老九-技术大黍 原文:分布式系统设计教材 社交:知乎 公众号:老九学堂(新人有惊喜) 特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系笔者授权 前言 本文由老 ...

  5. 【老九学堂】【C++】位运算符

    位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型 ...

  6. 【老九学堂】【C++】C++的发展史

    为了让小伙伴们在学习过程中,能收获更多的知识,达到真正的零基础入门和深入了解C++,老九君特地收集了有关C++发展相关的一些资料供大家查阅和学习: C++语言发展大概可以分为三个阶段: 第一阶段从80 ...

  7. 【老九学堂】【初识C语言】C语言中的运算符

    1运算符和表达式 C语言运算符是说明特定操作的符号,它是构造C语言表达式的工具.C语言的运算异常丰富,除了控制语句和输入输出以外的几乎所有的基本操作都作为运算符处理.除了常见的三大类,算术运算符.关系 ...

  8. 【老九学堂】【初识C语言】C语言保留字(关键字)详解

    保留字(reserved word) 保留字又称关键字. 指在高级语言中已经定义过的字,使用者不能再将这些字作为变量名或过程名使用. 每种程序设计语言都规定了自己的一套保留字. 例如:BASIC语言规 ...

  9. 【老九学堂】【初识C语言】二维数组

    一维数组只有一个下标,称为一维数组,其数组元素也称为单下标变量.在实际问题中有很多量是二维的或多维的,因此C语言允许构造多维数组.多维数组元素有多个下标,以标识它在数组中的位置,所以也称为多下标变量. ...

最新文章

  1. 新年不宕机就等它了!戴尔官网高效编程电脑OptiPlex 直降2500,低至3099!
  2. vim-go开发环境Tagbar插件和NERTree插件安装
  3. atoi() 与 itoa()函数的内部实现
  4. P1488 肥猫的游戏
  5. Catalan数(卡特兰数)
  6. 管家婆SQL SERVER数据库“可能发生了架构损坏。请运行DBCC CHECKCATALOG”修复
  7. 工作335:uni-ele-el-date-picker限制选择时间
  8. VSTO学习笔记(四)从SharePoint 2010中下载文件
  9. aws rds监控慢sql_如何使用Web控制台和AWS CLI停止AWS RDS SQL Server
  10. Factory Method 工厂方法
  11. 深测「小度人工智能音箱1S」:加冕的红外控制术,和掀起的一场智能大进化...
  12. 启动Kettle时报错找不到文件javaw.exe
  13. SMCJ6.0CA TVS二极管应用领域(瞬态抑制二极管)
  14. 04、Flutter FFI 字符串
  15. java设计ui界面(用户登录)
  16. 淘宝店铺运营经验分享,影响宝贝转化率的因素有哪些,如何提高转化
  17. obd协议 混动车_OBD协议介绍
  18. 王道_线性表代码合集
  19. sql server获取当前日期
  20. BBR 拥塞控制算法blog笔记

热门文章

  1. 通过简单的演示理解TCP/IP网络
  2. 255字符c语言中,在单片机C语言程序设计中,______类型数据经常用于处理ASCⅡ字符或处理小于等于255的整型数 答案:char...
  3. js中的颜色对应的常量代码code
  4. 【100%通过率】华为OD机试真题 Python 实现【整理扑克牌】【2022.11 Q4 新题】
  5. 不规则四边形填充平面 - Townscaper 网格生成算法复现
  6. 今日芯声 | 微软 Xbox 老大:关闭游戏直播平台 Mixer,我没有遗憾
  7. 读取工程下的文档 统计重复的姓名 并按次数排序 java_java并打印出重复的姓名和重复的次数,并按重复次数排序...
  8. 游戏的角色模型是如何创建的?ZBrush中制作3D兽人,全流程解析
  9. 技术干货 | 录屏采集实现教程 —— Windows桌面端
  10. 什么是网络监控?OpManager 网络监控解决方案