《C++ Primer Plus 第6版》读书笔记
知识点:
1.函数的返回值不能是数组,可以是其他任何类型
2.
const int ArSize = 8;
int cookies[ArSize] = { 1, 2, 3, 4, 5, 6, 7, 8 };
//sizeof cookies = 32
int 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;
}
对数组使用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 :4Count 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 减少输入,编程不易犯错 ,让程序更容易理解