版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}