数组形参
void printValues(int*);
void printValues(int[]);
void printValues(int[10]);//以上三种是等价的。
通常,将数组形参直接定义为指针要比使用语法定义更好。
第三种方式,形参的长度容易引起误解。
当编译器检查数组形参关联的实参时,它只会检查实参是不是指针、指针的类型和数组的类型是否匹配,而不会检查数组的长度。
大部分情况下,数组以普通的非引用类型传递,此时数组会转换为指针。形参复制的是这个指针的值,而不是数组元素本身。函数可以通过该指针改变它所指向的数组元素的值。不需要改变数组形参的元素时,函数应该将形参定义为指向const对象的指针。
void f(const int*);
通过引用传递数组
数组形参可声明为数组的引用。如果形参是数组的引用,编译器不会将数组实参转化为指针,而是传递数组的引用本身。在这种情况下,数组大小成为实参和形参的一部分,编译器会检查数组实参的大小与形参的大小是否匹配。
void printValues(int(&arr)[10]);
printValues函数只接受含有10个int数值的数组。
传递给函数的数组的处理
1、在数组本身放置一个标记来检测数组的结束。
2、传递指向数组的第一个和最后一个元素的下一个位置的指针
void printValues(int*);
void printValues(int[]);
void printValues(int[10]);//以上三种是等价的。
通常,将数组形参直接定义为指针要比使用语法定义更好。
第三种方式,形参的长度容易引起误解。
当编译器检查数组形参关联的实参时,它只会检查实参是不是指针、指针的类型和数组的类型是否匹配,而不会检查数组的长度。
大部分情况下,数组以普通的非引用类型传递,此时数组会转换为指针。形参复制的是这个指针的值,而不是数组元素本身。函数可以通过该指针改变它所指向的数组元素的值。不需要改变数组形参的元素时,函数应该将形参定义为指向const对象的指针。
void f(const int*);
通过引用传递数组
数组形参可声明为数组的引用。如果形参是数组的引用,编译器不会将数组实参转化为指针,而是传递数组的引用本身。在这种情况下,数组大小成为实参和形参的一部分,编译器会检查数组实参的大小与形参的大小是否匹配。
void printValues(int(&arr)[10]);
printValues函数只接受含有10个int数值的数组。
传递给函数的数组的处理
1、在数组本身放置一个标记来检测数组的结束。
2、传递指向数组的第一个和最后一个元素的下一个位置的指针
3、第二个参数传入数组的大小。
两种局部对象
自动对象---当定义它的函数被调用时才存在的对象,函数结束时,自动对象就会被撤销。
静态局部对象---不迟于在程序执行流程第一次经过该对象的定义语句时进行初始化,一旦创建,在程序结束前不会被撤销。
内联函数---避免函数调用的开销---内联机制适用于优化小的、只有几行的而且经常被调用的函数,大多数的编译器都不支持递归函数的内联。内联函数应该在头文件中定义,这一点不同于其他函数。