C++学习笔记7 - 函数

来源:互联网 发布:sql语句分组统计 编辑:程序博客网 时间:2024/06/05 02:46

《C++ Primer Plus  第6版》读书笔记

知识点:

1.函数的返回值不能是数组,可以是其他任何类型


2.

const int ArSize = 8;int cookies[ArSize] = { 1, 2, 3, 4, 5, 6, 7, 8 };//sizeof cookies = 32int sum_arr(int arr[], int n){int total = 0;for (int i = 0; i < n;i++){total = total + arr[i];}        //sizeof arr = 4  指针的长度return total;}


3.数组名来标记数组存储位置

  对数组使用sizeof返回整个数组的长度

  数组使用&返回整个数组的地址


4.仅当函数头或函数原型中时,int arr[] 与 int *arr 含义相同


5.恒等式

  arr[i] == *(ar + i); //是值

  &arr[i] == ar + i;// 是地址
6.指针加1,实际上是加上了一个与指针指向的类型的长度(以字节为单位)相等的值


7. 构思程序时将存储属性与操作结合起来,便是超OOP思想迈进了重要的一步


8.指向常量的指针

  int age = 10;

  const int *p = &age;

  不能通过 p 修改age.但age = 11允许自己改变,p可以指向另一个值


9.常量可以赋值给常量指针,但常量不能赋值给常规指针

  const int age = 10;

  const int *p = &age;  //OK

  const int age1 = 10;

  int *p = &age1;        //INVALID, 冲突,const变得荒谬

10.const 指针不能赋值给非const指针


11.const int age = 10;

  int * const p = &age;  //不能修改p的指向的地址


12.int fun(const int arr[], int len) // 不能修改数组中的值,只有一层间接关系可以使用这种技术,如果数组元素

  为指针或指针的指针则不能使用const


13.二维数组形参

  int data[3][4] = {{1,2,3,4},{5,6,7,8},{6,6,7,8}};

  int total = sun(data, 3);

  data是数组名,该数组有3个元素,第一个元素本身是一个数组,有4个int值组成。

  因此data类型是指向由4个int组成的数组的指针。

  函数原型为:int sum(int (*arr2)[4], int len);  括号必不可少,

  int *arr2[4] 含义为4个指向int的指针组成的数组

  int (*arr2)[4] 含义为指向4个int数组的指针

  另一种函数原型:int sum(int arr2[][4], int len);


14.函数中使用二维数组

  ar2[r][c] == *(*(ar2 + r) + c);


15.递归


16.

#include "stdafx.h"#include "iostream"void countdown(int n);int _tmain(int argc, _TCHAR* argv[]){using namespace std;countdown(4);return 0;}void countdown(int n){using namespace std;cout << "Count Down :" << n << endl; //前5次都能执行到这,然后if完返回if (n>0) //终止递归的条件,必须有{countdown(n - 1); }cout << n << ": Kabamm" << endl;}

输出结果:

Count Down :4
Count Down :3
Count Down :2
Count Down :1
Count Down :0
0: Kabamm
1: Kabamm
2: Kabamm
3: Kabamm
4: Kabamm

请按任意键继续. . .


17.函数指针

 double pam(int)

double (*pa)(int) 

pam是函数  (*pa)是函数   pa是函数指针

double (*pa)(int)  //函数指针

double *pa(int)    //返回指针的函数

18.

const double * (*pl)(const double *, int) = fl;

auto p2 = f2 //等同上面

(*pl)(av,3) == p2(va,3)   //可以省略*

19.三个函数指针的数组

const double * (*pa[3])(const double *, int ) = {fl, bl, cl};

auto pb = pa;  //等同上面

包含三个指针的数组,指针类型为函数指针

const double * px = pa[0](av, 3); 

const double * pz = (*pa[1])(av, 3);

//两种写法等效

const double a = *pa[0](av, 3); 

const double  b= *(*pa[1])(av, 3);

//返回的是值,两种写法等效

20.

(*pd)[3]  //pd是个指针 它指向一个包含三个元素的数组,这些元素是什么呢? 由pa的声明的其他部分描述

21.

pa和&pa[0] 的值相同,都是数组第一个元素的地址

pa 代表第一个元素的地址, pa +1  表示第二个元素

&pa 代表整个数组的首地址 ,&pa + 1  12个字节内存块的地址 

要得到第一个元素:

**&pa == *pa == pa[0]

22.

typedef const double * (*p_fun)(const double *, int);

p_fun p1 = f1;

p_fun pa[3] = {f1, f2, f3};

p_fun (*pd)[3] = &pa;

//typedef 减少输入,编程不易犯错 ,让程序更容易理解



1 0
原创粉丝点击