程序栈
支持函数执行的内存区域,通常和堆共存。即二者共同拥有一块内存区域,栈位于内存区域的下部,堆位于内存区域的上部。
函数传值
- 用指针传递数据: 一般用于对传入的数据进行修改
void funcA(int* num1,int* num2){
int temp;
temp = *num1;
*num1 = *num2;
*num2 = temp;
}
int main(){
int n1 = 10;
int n2 = 20;
funcA(&n1,&n2); //交换n1和n2 的值
// n1 = 20 , n2 = 10
}
//说明:在main函数中调用funcA的时候,使用了指针传递数据,执行到funcA的时候,funcA函数
//内部的局部变量,指向的值传递数据的地址,修改指向这个地址的值。即使函数执行完了也不影响
//已经修改过的值
- 用值传递:一般不对传入的数据修改,取决于其数据的拷贝赋值函数的实现
void funcA(int num1,int num2){
int temp;
temp = num1;
num1 = num2;
num2 = temp;
}
int main(){
int n1 = 10;
int n2 = 20;
funcA(n1,n2); //交换n1和n2 的值,失败
// n1 = 10 , n2 = 20
}
//执行funcA函数的时候,会将n1和n2分别拷贝一份副本,作为funcA局部变量使用,源数据没有在函数funcA中执行任何操作。因此数据不会发生变化。
- 用常量指针进行传递数据:和1的使用类似,不同的是指向常量的指针将不可以被修改。
void funcA(const int* num1,int* num2){
*num2 = *num1;
}
void funcB(const int* num1,int *num2){
int a = 100;
num1 = &a;
*num2 = *num1;
}
void funcC(const int* const num1,int *num2){
*num2 = *num1;
}
说明: funcA 和funcB 都传入了指向常量的指针,但是在funcB中还是隐式的将num1给更改了,要使的num1 不被更改应该使用const int* const num1 作为参数,具体参考 c指针相关文章
返回指针
- 在函数中有分配有效的内存空间,可以返回指针
- 在函数参数中有引用或者指针被传入,可以返回对应的指针
- 不可以返回局部数据的指针,会出现程序异常
函数指针
函数指针表示持有函数地址的指针。可以用于将函数赋值给这个函数指针,然后有函数指针进行数据的调用执行
例如:
void (*foo)()
void (*foo) ()
返回值 函数指针变量的名字 参数
示例:
int* f() 返回int类型指针的普通函数。
int (*f)() 返回int类型的函数指针。
int* (*f)()返回int类型指针的函数指针。
使用示例:
int (*fptr)(int);
int square(int num){
return num * num;
}
int main(){
int num = 10;
fptr = square; //使用函数指针
cout << fptr(num) << endl; //100
}
函数指针作为参数的使用
即这个要求传入的参数是一个符合函数指针定义的函数
int (*fptr)(int);
typedef int (*fptr1)(int,int);
int square(int num){
return num * num;
}
int sum(int num1, int num2){
return num1 * num2;
}
//要求传入的函数符合fptr1的类型定义,函数sum符合这个定义。
int square1(int num, fptr1 fp){
return fp(num,num);
}
int main() {
int num = 10;
fptr = square;
cout << fptr(num) << endl;
//传入函数指针的数据是sum函数
square1(num,sum);
return 0;
}
函数指针作为返回值
即函数返回值需要符合函数定义时候的函数指针要求
//函数指针定义
typedef int (*rfunc)(int,int);
//一般函数定义
int Summer(int num1 ,int num2){
return num1 + num2;
}
//返回函数指针的函数定义
rfunc returnFuncInfo(int style){
if(style == 1){
return Summer;
}
return Summer;
}
int main() {
//调用函数,返回函数指针
rfunc ff = returnFuncInfo(1) ;
//执行返回的函数指针。实际执行的是符合函数指针的函数。
cout << ff(10,23); //33
return 0;
}