- 指针存放了变量的地址,通过指针操作变量和直接操作变量的效果是一样的。因此使用函数的时候,可以把变量的地址作为参数传递给函数。
- 形参:函数的参数列表,是函数的局部变量,函数被调用的时候把实参赋值给形参;
实参:调用程序中书写在函数名括号的参数。 - 用解引用的方法,使用指针给函数传递参数,与直接使用变量传递参数效果是一样的,例:函数定义如下:
void func(int no, string str) { cout << "亲爱的" << no << "号你好,我是" << str << endl; }
int bianhao = 3; string message = "小小鸟"; int* pbianhao = &bianhao; string* pmessage = &message; func(bianhao, message);//直接使用变量传递参数 func(*pbianhao, *pmessage);//用解引用的方法使用指针给函数传递参数,与直接使用变量传递参数效果是一样的
分别直接用变量直接传递参数的方式和用解引用的方式用指针传递参数,结果是一样的
-
用解引用的方法修改内存中的参数,同样也会改变实参的值,因为对用解引用的方式对指针进行操作,相当于直接对变量进行操作
int bianhao = 3; string message = "小小鸟"; int* pbianhao = &bianhao; string* pmessage = &message; //func(bianhao, message);//直接使用变量传递参数 //func(*pbianhao, *pmessage);//用解引用的方法使用指针给函数传递参数,与直接使用变量传递参数效果是一样的 //用解引用的方法修改内存中的参数,同样也会改变实参的值,因为对用解引用的方式对指针进行操作,相当于直接对变量进行操作 *pbianhao = 8;//解引用的方式修改所指向的变量的值 *pmessage = "大狗狗";//解引用的方式修改所指向的变量的值 func(*pbianhao, *pmessage);//用解引用的方法,使用指针给函数传递参数,与直接使用变量传递参数效果是一样的 func(bianhao, message); system("pause");
-
如果把函数的形参声明为指针,调用函数时传入的应该是实参对应的地址传进去。在函数值中通过解引用的方式直接操作内存中的数据,可以修改实参的值,这种方法被通俗地称为地址传递或者传地址。
值传递:函数的形参是普通变量
定义一个以指针为形参的函数,如下//用指针作为函数的形参,函数调用传值的时候传进去的是地址 void func1(int* pno, string* pstr) { cout << "亲爱的" << *pno << "号你好,我是" << *pstr << endl; }
//形参为指针的函数的调用 int a1 = 10; string str1 = "小老虎"; func1(&a1,&str1);//func1的参数是指针形式,因此参数传入的时候传的是变量的地址
-
传地址的意义
(1)在函数中修改实参的值
应用:当函数有多个返回值,用传地址的方式实现一个函数的多个返回值,在函数中修改实参的值。例:void func2(int a, int b,int c,int* max,int* min )//返回最大和最小的值 { *max = a > b ? a : b; *min = a < b ? a : b; *max = *max > c ? *max : c; *min = *min < c ? *min : c; cout << "max=" << *max << endl; cout << "min=" << *min << endl; }
//用传地址的方式实现一个函数的多个返回值 int b1 = 100, b2 = 200, b3 = 300,m = 0, n = 0; func2(b1,b2,b3,&m,&n);
(2)减少内存拷贝,提升性能
以win32平台为例,string所占内存为28个字节(在x64平台为40),指针占用4字节(64位平台占用8字节)
对函数来说,每调用一次就要为形参分配内存。对应下面两个函数来讲,实现的是相同的功能,如用指针作为形参,在win32中,内存开销就是4*2=8个字节。每个指针4字节,如不使用指针,使用普通变量,则内存开销是4+28=32字节,其中int占4字节,string占28字节,内存开销大很多。//形参不用指针 void func(int no, string str) { cout << "亲爱的" << no << "号你好,我是" << str << endl; } //用指针作为函数的形参,函数调用传值的时候传进去的是地址 void func1(int* pno, string* pstr) { cout << "亲爱的" << *pno << "号你好,我是" << *pstr << endl; }
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交