(数组名可以认为是第一个元素的地址)
数组名就是地址,这里的arr可以成为数组首地址也可以当做指针
等价于:
int sum_arr(int * arr,int n);
在C++中当且仅当用于函数头或函数原型的时候,int * arr 和 int arr[]的含义是一样的
①可以修改数组内容:
void fModify(int arr[],int n)
②不可以修改数组内容:
void noChange(const int arr[] ,int n);
①通过传递两个指针完成:函数原型:
int sumarr(const int * begin,const int * end);
1)定义数组:
int cookies[size] = {1,2,3,4,5,6,7,8,9}
2)使用:
int sum = sumarr(cookies,cookies+size);
const让指针指向一个常量对象,防止使用指针来修改指针指向地址的字面值
int sum(int (*arr)[4],int size); <======> int sum(int arr[][4],int size);
第一个参数都表明,四个指向int的指针组成的数组,列数是给定的,行数由size指定。
调用元素的方式:
arr[r][c] = *(*(arr+r)+c)
注意形参的定义以及返回值
#include <iostream> using namespace std; struct polar { double distance; double angle; }; struct rect { double x; double y; }; polar rect_to_polar(rect xyposition); int main() { rect rplace; polar pplace; rplace.x = 4.5; rplace.y = 9.8; pplace = rect_to_polar(rplace); cout << pplace.angle << endl; cout << pplace.distance << endl; } polar rect_to_polar(rect xyposition) { polar answer; answer.distance = sqrt(xyposition.x * xyposition.x + xyposition.y * xyposition.y); answer.angle = atan2(xyposition.y, xyposition.x); return answer; }
#include <iostream> using namespace std; struct polar { double distance; double angle; }; struct rect { double x; double y; }; void show(const polar* pda); int main() { polar pplace; pplace.angle = 1.2; pplace.distance = 58.2; show(&pplace); } void show(const polar* pda) { cout << pda->angle << endl; cout << pda->distance << endl; }
函数名本身就是一个地址,引用的时候,单纯的函数名就是一个函数的地址,函数名+()表示引用函数的返回值
①必须指定指针指向的函数类型
②举例:double pam(int a); //函数原型
—> double (*pf)(int a) //定义指针
----> pf = pam 使用(*pf替换函数名)
(3)函数指针作为传参
Use是另外的一个函数,使用这个函数需要传两个值,第一个整形数据,另一个是一个地址,这个地址是函数的地址
①Use(int a,double (*pf)(int b)) ----> Use(3,pam)
#include <iostream> using namespace std; int sum(int a); int use(int a, int(*pf)(int)); int main() { int sumend; int (*pf)(int); //定义一个int型指针 pf = sum; //将sum函数的首地址赋给pf指针 sumend = use(1, pf); //将pf指针作为函数传入use函数 cout << sumend << endl; } int sum(int a) { return a+1; } int use(int a, int(*pf)(int)) { int b = pf(a); //在use函数中可以直接使用pf,此时的pf指针相当于一个函数名 return b+1; }
给变量起别名,可以实现跟原名一样的操作,包括改变变量的字面值。
本质:在C++内部实现的是一个指针常量
①Typename & 别名 = 变量名
①让形参可以修饰实参,等价于地址做参数
②eg:
void swap(int & a,int & b) { Int temp = a; a = b; b = temp; //能够实现交换 }
①不要返回局部变量的引用 即放在栈区的变量
②函数的调用可以作为左值使用
#include <iostream> using namespace std; int& test(); int main() { int& ref = test(); ref = 100; //引用可以操作字面值 test() = 1000; //函数返回值可以作为左值 } int& test() { static int a = 10; return a; }
函数默认值
(1)用户输入的参数优先级高于默认参数
(2)某个形参有默认值,则后面的每一个形参都要有默认值,否则会报错
(3)函数声明和函数实现两个地方只能有一个地方有默认值,不能同时设置默认值,一样的也不行