数组作为函数参数

数组传参时,会退化为指针。 类型是第一个元素的地址类型。
(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 之函数及函数指针相关推荐

  1. C++ Primer 第五版 第6章 6.1——函数及函数定义及调用阅读笔记

    习题答案请参考:C++ Primer 第五版 第6章 6.1 函数及函数定义及调用习题答案 目录 6.1 函数基础 函数定义 函数调用 函数的形参和实参 函数的返回类型 局部静态对象 函数声明 头文件 ...

  2. C++ Primer Plus学习笔记之函数探幽

    前言 个人觉得学习编程最有效的方法是阅读专业的书籍,通过阅读专业书籍可以构建更加系统化的知识体系. 一直以来都很想深入学习一下C++,将其作为自己的主力开发语言.现在为了完成自己这一直以来的心愿,准备 ...

  3. C++ 笔记(13)— 函数(函数声明、函数定义、函数调用[传值、指针、引用]、函数参数默认值、函数重载)

    每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数. 1. 函数声明 函数声明告诉编译器函数的名称.返回类型和参数.函数声明包括以下几个部分: ret ...

  4. C/C++ 指针函数 与 函数指针

    指针函数是个函数,是返回指针类型到函数. 函数指针是个指针,是指向函数地址到指针. 区分两者的关键点是,函数名是否用*和括号"包围"起来. 1 #include <stdio ...

  5. 声明与函数、函数指针

    概述 在很多情况下,尤其是读别人所写代码的时候,对 C语言声明的理解能力变得非常重要,而C语言本身的凝练简约也使得C语言的声明常常会令人感到非常困惑,因此,在这里我用一篇的内容来集中阐述一下这个问题. ...

  6. C语言--指针函数和函数指针

    指针函数和函数指针 指针函数其实是一个简称,是指带指针的函数,它本质上是一个函数,只是返回的是某种类型的指针.其定义的格式为: 类型标识符 *函数名(参数表)  函数指针,从本质上说是一个指针,只是它 ...

  7. 指针数组,数组指针,指针函数,函数指针,二级指针详解

    先看个简单的:char *p,这定义了一个指针,指针指向的数据类型是字符型,char  *(p)定义了一个指针P: char *p[4], 为指针数组,由于[]的优先级高于*,所以p先和[]结合,p[ ...

  8. 返回函数局部变量的指针和引用

    返回函数局部变量的指针和引用是不允许的,容易造成野指针.不管是通过返回值或者出参返回局部变量的指针都是不允许的. 但针对各种情况,可以具体研究一下返回函数指针和引用的异常情况. 例子1: #inclu ...

  9. 【转】 指针函数与函数指针的区别

    一. 在学习arm过程中发现这"指针函数"与"函数指针"容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义: 1.指针函数是指带指针的 ...

  10. 指向成员函数的指针有什么用_指针函数,函数指针,有点懵圈了?你能分清楚吗...

    指针函数和函数指针到底怎么区分? 1.前言 数组.指针,这两个词结合的顺序不同,其意义也不同. 同样的,函数.指针这两个词结合的顺序不同其意义也不同,即指针函数与函数指针的意义不同. 2.指针函数 指 ...

最新文章

  1. 高性能mysql的事物隔离级别
  2. 深度解析iPhone Category用法
  3. “迭代期内无变更”与研发心理学(承诺管理,MosCoW方法)
  4. 为何要弃 Java、Swift 于不顾,而选择 Python?
  5. Tomcat(Install)
  6. Hash 函数的现状,2012
  7. Atitit 标记语言ML(Markup Language) v4 目录 1. 标记语言ML Markup Language 1 1.1. 简介 1 2. 置标语言置标语言通常可以分为三类:标识性的
  8. Java jar 如何防止被反编译
  9. html实现百度换肤,百度换肤
  10. 大学毕业4年-回顾和总结(3)-投资理财观-图穷而真相现
  11. 苹果公司的电脑产品及其历史
  12. Niagara内容示例 4.3 Mesh Orientation vs. Rotational Force
  13. 测试工程师-入门指南
  14. 使用Maya的XGen快速头发建模
  15. Ghostscript已有字体报错can‘t find font file问题的原因
  16. jQuery弹幕插件
  17. python实现小米手机 dingding 自动打卡
  18. 技术能力 和专长领域 计算机,技术专长和领域专长对人机交互的影响分析
  19. 智慧防雷+智能防雷安全检测系统
  20. 由一张血管图片引发的算法分析(二)

热门文章

  1. 使用 Cobbler 自动化和管理系统安装
  2. 6分钟速配 电商平台百万并发云压测实战
  3. Redis 介绍2——常见基本类型
  4. login RPi via serial port
  5. 趣味理解ADO.NET对象模型
  6. InnoDB Plugin 1.0.2 for MySQL 5.1.30 (GA) Released
  7. Nginx架构详解:nginx 的安装和配置
  8. PHP拼接唯一索引,合并两个数组数据
  9. fatal: empty string is not a valid pathspec, please use . instead if you meant to match all paths
  10. matlab条形图颜色矩阵,Matlab条形图 – 根据符号和大小填充不同颜色的条形图