c 指针(指针和函数)

程序栈

支持函数执行的内存区域,通常和堆共存。即二者共同拥有一块内存区域,栈位于内存区域的下部,堆位于内存区域的上部。

函数传值
  1. 用指针传递数据: 一般用于对传入的数据进行修改
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函数
//内部的局部变量,指向的值传递数据的地址,修改指向这个地址的值。即使函数执行完了也不影响
//已经修改过的值
  1. 用值传递:一般不对传入的数据修改,取决于其数据的拷贝赋值函数的实现
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. 用常量指针进行传递数据:和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指针相关文章
返回指针
  1. 在函数中有分配有效的内存空间,可以返回指针
  2. 在函数参数中有引用或者指针被传入,可以返回对应的指针
  3. 不可以返回局部数据的指针,会出现程序异常
函数指针

函数指针表示持有函数地址的指针。可以用于将函数赋值给这个函数指针,然后有函数指针进行数据的调用执行

例如:

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值