C++渐习记--(4)函数指针

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zx13525079024/article/details/82937139

c++指针博大精深,气宇轩昂,不是你我一朝一夕所能理解的,也是咱们一两篇文章所能讲透彻的,边学边写边理解,切忌,代码一定要自己敲出来,才能理解透彻。

1. 指针参数

    形参为指针,当对形参进行操作的时候,也相当于对实参操作

void changefunc(int *n)
{
	*n = *n + 1;
}

于值传递,指针传递,引用传递这几个方面还会存在误区;

值传递:

形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。

指针传递:

形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作

引用传递:

形参相当于是实参的"别名",对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

2. 函数指针

    函数存放在内存中的代码区域,同样也是有指针的,函数指针的地址就是函数的名字,例如 int test(int a) ,指针地址就是test

    函数指针定义有参数和返回值 

  int (*fp)(int a);

    

// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<string>
#include<iostream>
using namespace std;

void changefunc(int *n);

int test(int a);
int _tmain(int argc, _TCHAR* argv[])
{
	cout << "-----------------"<<endl;

	//int a = 10;//定义变量
	//int *p = &a; //定义指针P
	////在此要说明一点, p指的是地址,*p指的是地址中存储的值
	//cout << "a:" <<a<< endl;
	//cout << "&a:" << &a << endl;
	//cout << "p:" << p << endl;
	//cout << "*p:" << *p << endl;
	//cout << "&*p:" << &*p << endl;

	cout << "指针参数" << endl;
	int m = 10;
	cout << "改变前m:" << m << "--&m" <<&m<< endl;
	changefunc(&m);
	cout << "改变后m:" << m << "--&m" << &m << endl;
	//发现传值后值变了,地址没有变
   cout<< "-----------------"<<endl;

   cout << "函数指针" << endl;
   cout << "-----------------" << endl;
   int(*f)(int a);
   f = test;
   cout << "返回值:" <<f(3)<< endl;
   cout << "-----------------" << endl;

	system("pause");

	return 0;
}

void changefunc(int *n)
{
	*n = *n + 1;
}

int test(int a)
{
	a = a + 1;

	return a;
}





  这个地址讲的很详细,http://www.runoob.com/cplusplus/cpp-pointers.html

猜你喜欢

转载自blog.csdn.net/zx13525079024/article/details/82937139