c++ primer plus 之函数及函数指针
数组作为函数参数
数组传参时,会退化为指针。 类型是第一个元素的地址类型。
(1)退化的意义:C语言只会以值拷贝的方式传递参数,参数传递时,如果只拷贝整个数组,效率会大大降低,并且在参数位于栈上,太大的数组拷贝将会导致栈溢出。
(2)因此,C语言将数组的传参进行了退化。将整个数组拷贝一份传入函数时,将数组名看做常量指针,传数组首元素的地址。
数组不能自增、自减运算。而指针可以。
二维数组和函数
二维数组作为函数的参数,
如int a[3][4] = {(1,1,1,1),(2,2,2,2),(3,3,3,3),};
sum(a,3);
关键是sum申明的原型
sum(int (ar*)[4],int size); // int (ar*)[4]表示的是数组指针
或者是 sum(int ar[][4],int size);
函数和字符串
字符串与常规的数组区别是,字符串有内置的结束符。
将字符串作为函数参数意味着传递的是地址。有三种表示方式
1.char数组 如 char p[10] = "asdf"; func(p);
2.用引号括起来的字符串常量 func("asdf");
3.被设置为字符串的地址的char指针。如 char *p = "asdf"; func(p);
其中func的申明原型都是 func(char *p);
字符串函数返回表示
函数无法返回一个字符串,但可以返回字符串的地址。
函数和结构
结构作为函数参数有三种方式表示
1.跟普通类型一样,按值传递
2.结构地址,按指针来访问 //可以节省时间和空间
3,结构的引用 //不用创建内存空间
函数和string对象
如果需要多个字符串,可以声明一个string数组,而不是二维char数组。
如 string list[10];
display(list,10);
display原型 display(string list[],int size);
函数指针
可以把函数地址做为函数的参数进行传递。
1.获取函数的地址。 //函数地址就是函数名(后面不带参数),如果带参数就是函数返回值了 int func(int a ); func就是函数地址
2.声明一个函数指针并赋值初始化。 函数指针的声明为 int (*pf)(int) = func;
3.使用函数指针调用函数。 int b = pf(1); 或者int b = *pf(1);两种方式都可以。
如
float functionadd(int a, float b);
float functionadd(int a, float b)
{
return a + b;
}
float(*pfuna)(int, float) = functionadd;
pfuna(1,1.3);
声明的两种方式
1.进一步使用typedef进行简化 typedef 返回类型(*函数指针类型名称)(参数列表)
float functionadd(int a, float b);
float functionadd(int a, float b)
{
return a + b;
}
typedef float (*pfuna)(int, float);
pfuna fa = functionadd;
fa(1, 1.3);
2.使用using 的方式替换typedef
float functionadd(int a, float b);
float functionadd(int a, float b)
{
return a + b;
}
using pfuna = float(*)(int, float);
pfuna fa = functionadd;
fa(1, 1.3);
3.auto. 直接粗暴 auto
float functionadd(int a, float b);
float functionadd(int a, float b)
{
return a + b;
}
auto fa = functionadd;
fa(1, 1.3);
使用函数指针
1.调用函数 :有两种方式
a. 函数指针名称 (实参列表) int b = pf(1);
b.(*函数指针名称)(实参列表)int b = *pf(1);
2.作为参数传递
具体见:
内联函数 声明或定义前加上inline
1.内联函数的运行速度比常规函数稍快,但占用更多内存。
2.内联函数不用递归,行数不能过长。
引用
引用接近const指针,必须在创建时进行初始化。
比较适合在传递的参数对象比较大时,使用引用。
默认参数
通过函数原型设置,即在声明时设置,默认参数值就是初始化值,但必须从右向左添加默认值。
int func(int i, int j = 0);
函数重载
函数模板
template<typename T>
或者是template<class T>
void func(T a);
c++ primer plus 之函数及函数指针相关推荐
- C++ Primer 第五版 第6章 6.1——函数及函数定义及调用阅读笔记
习题答案请参考:C++ Primer 第五版 第6章 6.1 函数及函数定义及调用习题答案 目录 6.1 函数基础 函数定义 函数调用 函数的形参和实参 函数的返回类型 局部静态对象 函数声明 头文件 ...
- C++ Primer Plus学习笔记之函数探幽
前言 个人觉得学习编程最有效的方法是阅读专业的书籍,通过阅读专业书籍可以构建更加系统化的知识体系. 一直以来都很想深入学习一下C++,将其作为自己的主力开发语言.现在为了完成自己这一直以来的心愿,准备 ...
- C++ 笔记(13)— 函数(函数声明、函数定义、函数调用[传值、指针、引用]、函数参数默认值、函数重载)
每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数. 1. 函数声明 函数声明告诉编译器函数的名称.返回类型和参数.函数声明包括以下几个部分: ret ...
- C/C++ 指针函数 与 函数指针
指针函数是个函数,是返回指针类型到函数. 函数指针是个指针,是指向函数地址到指针. 区分两者的关键点是,函数名是否用*和括号"包围"起来. 1 #include <stdio ...
- 声明与函数、函数指针
概述 在很多情况下,尤其是读别人所写代码的时候,对 C语言声明的理解能力变得非常重要,而C语言本身的凝练简约也使得C语言的声明常常会令人感到非常困惑,因此,在这里我用一篇的内容来集中阐述一下这个问题. ...
- C语言--指针函数和函数指针
指针函数和函数指针 指针函数其实是一个简称,是指带指针的函数,它本质上是一个函数,只是返回的是某种类型的指针.其定义的格式为: 类型标识符 *函数名(参数表) 函数指针,从本质上说是一个指针,只是它 ...
- 指针数组,数组指针,指针函数,函数指针,二级指针详解
先看个简单的:char *p,这定义了一个指针,指针指向的数据类型是字符型,char *(p)定义了一个指针P: char *p[4], 为指针数组,由于[]的优先级高于*,所以p先和[]结合,p[ ...
- 返回函数局部变量的指针和引用
返回函数局部变量的指针和引用是不允许的,容易造成野指针.不管是通过返回值或者出参返回局部变量的指针都是不允许的. 但针对各种情况,可以具体研究一下返回函数指针和引用的异常情况. 例子1: #inclu ...
- 【转】 指针函数与函数指针的区别
一. 在学习arm过程中发现这"指针函数"与"函数指针"容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义: 1.指针函数是指带指针的 ...
- 指向成员函数的指针有什么用_指针函数,函数指针,有点懵圈了?你能分清楚吗...
指针函数和函数指针到底怎么区分? 1.前言 数组.指针,这两个词结合的顺序不同,其意义也不同. 同样的,函数.指针这两个词结合的顺序不同其意义也不同,即指针函数与函数指针的意义不同. 2.指针函数 指 ...
最新文章
- 高性能mysql的事物隔离级别
- 深度解析iPhone Category用法
- “迭代期内无变更”与研发心理学(承诺管理,MosCoW方法)
- 为何要弃 Java、Swift 于不顾,而选择 Python?
- Tomcat(Install)
- Hash 函数的现状,2012
- Atitit 标记语言ML(Markup Language) v4 目录 1. 标记语言ML Markup Language	1 1.1. 简介	1 2. 置标语言置标语言通常可以分为三类:标识性的
- Java jar 如何防止被反编译
- html实现百度换肤,百度换肤
- 大学毕业4年-回顾和总结(3)-投资理财观-图穷而真相现
- 苹果公司的电脑产品及其历史
- Niagara内容示例 4.3 Mesh Orientation vs. Rotational Force
- 测试工程师-入门指南
- 使用Maya的XGen快速头发建模
- Ghostscript已有字体报错can‘t find font file问题的原因
- jQuery弹幕插件
- python实现小米手机 dingding 自动打卡
- 技术能力 和专长领域 计算机,技术专长和领域专长对人机交互的影响分析
- 智慧防雷+智能防雷安全检测系统
- 由一张血管图片引发的算法分析(二)
热门文章
- 使用 Cobbler 自动化和管理系统安装
- 6分钟速配 电商平台百万并发云压测实战
- Redis 介绍2——常见基本类型
- login RPi via serial port
- 趣味理解ADO.NET对象模型
- InnoDB Plugin 1.0.2 for MySQL 5.1.30 (GA) Released
- Nginx架构详解:nginx 的安装和配置
- PHP拼接唯一索引,合并两个数组数据
- fatal: empty string is not a valid pathspec, please use . instead if you meant to match all paths
- matlab条形图颜色矩阵,Matlab条形图 – 根据符号和大小填充不同颜色的条形图