【c++】【基础】【primer_plus】【第七章】函数
定义及声明
函数是语句执行的空间,通常一个c++程度会由许多函数组成,c语言更是如此。通过调用函数执行函数中的代码,使程序按照一定的流程进行。由此可见一个函数可以被多次使用,简化了重复的过程的代码量,所以说函数就是功能的实现。
函数的一般格式如下。
1 | // 返回值类型 函数名 参数列表 |
如下示例代码,分别包含了函数的声明、定义和调用。
1 |
|
函数可在声明处直接定义,但不可以在main
函数之后声明,否则识别不出。函数的返回值类型可为整型、浮点型、指针、字符、结构体、对象等。当函数返回值类型为void
时不需要有return语句
,但可在必要的地方使用return语句
来直接跳出函数体。
函数返回值不可为数组,但可以将数组作为结构体或对象的组成部分来返回。
函数原型声明时的参数列表里可不包括变量名,也不必与定义时的变量名一致。
函数参数
函数的参数相当于在函数中声明的局部变量。将参量赋值给参数的过程相当于给函数的局部变量赋值的过程。
一个函数可以有多个参数,使用逗号隔开。
函数与数组
1 | int sum_arr(int arr[], int n) { |
方括号为空表示可以将任意长度的数组传递给此函数。arr
实际上不是一个数组,而是一个指针,所以才可以传任意长度。调用时将数组名传入此函数列表作为指针。
在函数中可以像使用数组一样使用指针参数。其真正正确的写法应该是int sum(int* arr, int n);
,但是在函数原型中,int* arr
和int arr[]
含义相同。
将数组传入函数时,函数里修改的并非数组的副本,而是数组本身,这也是因为传进来的是真实的指针地址。
对arr
使用sizeof()
并非获取整个数组的长度,而是int*
指针的长度(可能是4字节)。
有时候不想修改原数组的数据,可对函数的数组参数使用const
关键字。
1 | void show_arr(const int arr[], int n) { |
数组区间
1 | int sum_arr(const int* begin, const int* end) { |
如上代码所示,数组区间指两个指针,一个指向数组的开始,一个指向数组的末尾。数组区间是我们之后要接触到的迭代器的雏形。
指针与const
让指针指向一个常量对象。
1 | int a = 5; |
p
指向一个const int
类型,即不能使用p
来修改其指向的值(但可能会以其他方式修改) 即(*p)
的值为const
类型,不可修改。
但p
的值是可以修改的,如p++
。即p
可以指向不同的对象,但其指向的对象不能通过p
修改。
注意,不可将const
的地址赋给非const
指针,这样会使const
无意义。如
1 | const int a = 5; |
在上述代码中,因为(*p)
为非const
的,所以可以通过(*p)
修改a
的值,那么a
的const
属性就无用了。
除此之外,在只有一级间接关系的情况下将非const
指针赋给const
指针是安全的。
将指针本身声明为常量
1 | int a = 5; |
p
为const
类型,指向一个int
。即p
只能指向a
,不能再指向其他的地址。即p
的值为const
,不可修改。
但可以用p
来修改a
的值。即(*p)
的值为非const
的,可以修改。
指向const对象的const指针
1 | double b = 0.5; |
此时p
和(*p)
都是const
,都不能用来修改b
的值。