C++学习笔记7 - 函数

《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;
}


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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值