type_name function_name (parament_list) {
statements;
return value ;
}
#include <iostream>
#include <fstream>
#include <cassert>
using namespace std ;
int sum(int a, int b);
int main() {
cout << sum(1 , 2 ) << endl;
return 0 ;
}
int sum(int a, int b) {
return a + b;
}
函数可在声明处直接定义, 但不可以在main函数之后声明 – 识别不出 返回值类型
函数返回值类型可为 整型, 浮点型,指针,字符,结构体,对象等 函数返回值类型可为 void, 此时不需要return,但可在必要的地方使用 return; 跳出函数体 函数返回值不可为数组, 但可以将数组作为结构体或对象的组成部分来返回 函数原型声明时的参数列表里可不包括变量名, 也不必与定义时的变量名一致
函数的参数相当于在函数中声明的局部变量 将参量赋值给参数的过程相当于给函数的局部变量赋值的过程 一个函数可以有多个参数,使用逗号隔开
int sum_arr(int arr[], int n) {
int res = 0 ;
for (int i = 0 ; i < n; ++i) res += arr[i];
return res
}
方括号为空表示可以将任意长度的数组传递给此函数 arr实际上不是一个数组,而是一个指针 – 所以才可以传任意长度 调用时将数组名传入此函数列表 – 作为指针 在函数中可以像使用数组一样使用指针参数 真正正确的写法应该是 int sum(int* arr, int n);
但是在函数原型中,int* arr 和 int arr[] 含义相同 将数组传入函数时,函数里修改的并非数组的副本,而是数组本身 – 传进来的是真实的地址 对arr使用sizeof并非是整个数组的长度, 而是int*指针的长度(可能是4字节) 有时候不想修改原数组的数据,可对函数的数组参数使用const关键字
void show_arr(const int arr[], int n) {
for (int i = 0 ; i < n; ++i) cout << arr[i] << endl;
}
int sum_arr(const int * begin, const int * end ) {
int tot = 0 ;
for (const int *p = begin; p != end ; ++p) tot += (*p);
return tot;
}
int a[5 ] = {1 , 2 , 3 , 4 , 5 };
cout << sum_arr(a+1 , a+3 ) << endl;
让指针指向一个常量对象
p 指向一个const int 即不能使用p来修改其指向的值(但可能会以其他方式修改) 即 (*p) 的值为const, 不可修改 但 p 的值是可以修改的(如 p++ ) 不可将const 的地址赋给非const指针(这样会使const无意义) 只有在一级间接关系的情况下将非const指针赋给const 指针是安全的 int a = 5 ;
const int * p = &a;
将指针本身声明为常量
p 为const类型, 指向一个int 即 p 只能指向a, 不能再指向其他的地址 即 p 的值为const, 不可修改 但可使用 p 来修改a的值 即 (*p) 的值为非const的, 可以修改 int a = 5 ;
int * const p = &a;
如果愿意,也可声明指向const对象的const指针
此时 p 和 (*p) 都是const, 都不能用来修改b的值 double b = 0.5 ;
const double * const p = &b;