C++ Primer Plus 学习笔记2:第7章 函数——C++的编程模块

  • C++函数不能直接返回数组,但是可以将数组作为结构或对象组成部分来返回
  • 函数定义、函数原型、函数调用
  • 函数原型由函数返回类型、函数名、参数表组成
  • 函数原型常常“隐藏”在include文件中
  • 函数原型描述了函数到编译器的接口,否则编译器是不会“猜测”函数的参数类型和返回值类型的。函数可能不在被编译的文件里,C++允许将一个程序放在多个文件中,单独编译这些文件,再将他们组合起来。如果函数位于库中,情况也是一样的。如果我们想避免提供函数原型,那么只有一个方法——在每次使用之前定义它。
  • 原型可以不提供变量名,但
  • 用于接收传递值的变量被成为形参(argument,参数),传递给函数的值被成为实参( parameter, 参量)。
  • cin.get()cin.get(ch)包括了空格和换行符,而cin跳过空格和换行符
  • 只有在函数原型中可以使用int arry[]这样的声明方式来表示指针,其作用与int * arry是等效的。
  • 强调:指针+1表示的是指针加上指针所指向的数据类型所占据的内存空间数
  • 对数组名使用sizeof的时候,返回的是整个数组的内存块的大小。对指针使用sizeof的时候,返回的是指针占用内存的大小。
  • 因此,在使用数组作为函数参数的时候,要显式地传递数组元素的个数,而不能用sizeof,在函数内部使用sizeof,相当于对按值传递得到的变量取了sizeof
  • 之前常见的ptr != end实际上是“超尾”的概念,即数组最后一个元素的后面的值。
  • const 用来修饰指针和用来修饰指针指向的值是有差别的:
const int *finger;
int * const finger;

前者的指针可以修改,但不可以修改指针所指向的值,后者的指向值可以修改,但指针不能指向别的值,因此,当传递数组名的时候:

void function_name(const int arr[])

表示的是arr中的元素不可以被修改

  • 只要谈到函数,一定要考虑变量的传递方式,Python就不能够显式地指定传递方式。
  • 函数的参数不能是数组
  • 如果要传递一个数组,就要时刻记住“数组名是数组第一个元素的地址”
  • void function_name(int (*arr)[4], int size)的意思是传递一个指向4整数元素组成的数组的指针,void function_name(int *arr[4], int size)的意思是传递一个4个指向整数的指针构成的数组。
  • void function_name(int arr[][4])void function_name(int (*arr)[4], int size) 相同
  • 在传递二维数组时候不用const了,因为已经是二层间接关系了
  • 字符串包含结束字符,否则只能叫char数组
  • 通过函数传递指针,特别是指向数组的指针,在解引用时候比较不方便,如:p是一个指向std:array的指针,那么如果要解引用的话就需要(*p)[3]。这个和直接传递指向一个类或结构的指针不同,如果是指向类或结构,可以用p->fieldname的形式。因此,传递引用就有必要了:传递的实际上是指针,使用起来却和直接使用它的值是一样的。
  • 函数的地址是存储其机器语言代码的内存的开始地址
  • *()[]的优先级问题:*pf(int)意味着pf是一个返回指针的函数,而(*pf)(int)意味着pf是一个指向函数的指针。
  • []的优先级高于*,因此在声明类似于*p[3]这样的变量时候,先声明了p是有三个元素的变量,然后三个元素的类型为指针
  • typedef可以减少输入量,将一个类型名用一个自定义的名称替换掉,比如typedef const double *(*pfunction)*(const double * int);

你可能感兴趣的:(计算机基础,算法与数据结构)