小初学者有关函数参数传递有关问题
小菜鸟求救有关函数参数传递问题
我写的程序如下所示,最后输出时x,y的值并没有交换呀,而注释里那种方法输出时x,y的值交换了,其中的原因还请详解,万分感谢。
#include<iostream.h>
void jiaohuan( int *a,int *b);
main()
{
int x=0,y=1;
jiaohuan( &x,&y);
cout<<x<<y<<endl;
return 0;
}
void jiaohuan( int *a,int *b)
{ int *temp;
temp=a;
a=b;
b=temp;
}
/*void jiaohuan( int *a,int *b)
{ int temp;
temp=*a;
*a=*b;
*b=temp;
}*/
------解决方案--------------------
a和b在函数内都是局部变量,*a和*b是把它们所指向的内容进行交换,所以你可以看到值的变化;
而a和b纯粹是指针的指向进行交换,局部变量出函数后没有任何意义。
------解决方案--------------------
形参和实参的问题 另外指针也是一个数值
------解决方案--------------------
函数传入x,y地址时只是把他的地址值复制过来赋值给指针a、b,a、b是在堆空间,无论a、b怎么交换,最后都销毁,原来的x,y并不发生变化。
------解决方案--------------------
C所有参数都是值传递,不过可以用指针的值传递,来模拟引用传递。
C++除了引用参数,其他都是值传递。
void jiaohuan( int *a,int *b)//指针的值传递,来模拟引用传递,C交换函数的标准写法
{ int temp;
temp=*a;//交换指针指向的对象,而不是指针, *a=*b;
*b=temp;
//指针指向的对象的改变。会影响到那个对象本身
//因为 当对象(变量)地址传递给参数时 *a,*b 就是实参地址中的数据。
}
void jiaohuan( int *a,int *b)
{ int *temp;
temp=a;
a=b;
b=temp;
//不作为返回值的话,指针的改变传不出去;
//函数调用的值传递方式是单向传递,形参(指针)的值,是不会复制回去的。
//而且变量的地址是常量表达式,是不会改变的。
//交换指针的结果,只是在函数jiaohuan内部,临时让两个指针,交换了指向的对象。
//不影响实参地址内部的对象的值,达不到交换的目的。
}
C++ 库定义的交换函数
大致如下:
template<typename T>
void swap(T &a,T&b)//引用传递(也称地址传递)
{//引用参数,代表实参(所引用的对象)本身,所以交换后,实参就改变了。
T t(a);
a = b;
b = t;
}
------解决方案--------------------
这是指针变量和变量的指针问题,下面是我写的两个程序,看了后你会感悟一点:
#include "iostream.h"
int main()
{
int i=3;
int *iptr=&i;
int **iptrptr=&iptr;//iptr也是变量,也能够获取它的地址
cout <<"Address of Var i=" <<iptr <<endl;//输出iptr存储的内容,即i在内存中的地址
cout <<"Data of Var i=" <<*iptr <<endl;//输出iptr所指向的变量
cout <<"Address of Pointer iptr=" <<iptrptr <<endl;//输出iptr在内存中的地址
cout <<"Address of Var i=" <<*iptrptr <<endl;//输出iptrptr所指向的变量,即iptr
*iptr=2+*iptr;//*iptr可以作左值
cout <<"Data of Var i=" <<*iptr <<endl;
return 0;
}
#include<iostream>
using namespace std;
int main(){
int a=1;
const int *p=&a;
int b=2;
p=&b;
cout<<p<<endl;; //输出b的地址
cout<<*p; //这是输出的就是b的值
return 0;
}
我写的程序如下所示,最后输出时x,y的值并没有交换呀,而注释里那种方法输出时x,y的值交换了,其中的原因还请详解,万分感谢。
#include<iostream.h>
void jiaohuan( int *a,int *b);
main()
{
int x=0,y=1;
jiaohuan( &x,&y);
cout<<x<<y<<endl;
return 0;
}
void jiaohuan( int *a,int *b)
{ int *temp;
temp=a;
a=b;
b=temp;
}
/*void jiaohuan( int *a,int *b)
{ int temp;
temp=*a;
*a=*b;
*b=temp;
}*/
------解决方案--------------------
a和b在函数内都是局部变量,*a和*b是把它们所指向的内容进行交换,所以你可以看到值的变化;
而a和b纯粹是指针的指向进行交换,局部变量出函数后没有任何意义。
------解决方案--------------------
形参和实参的问题 另外指针也是一个数值
------解决方案--------------------
函数传入x,y地址时只是把他的地址值复制过来赋值给指针a、b,a、b是在堆空间,无论a、b怎么交换,最后都销毁,原来的x,y并不发生变化。
------解决方案--------------------
C所有参数都是值传递,不过可以用指针的值传递,来模拟引用传递。
C++除了引用参数,其他都是值传递。
void jiaohuan( int *a,int *b)//指针的值传递,来模拟引用传递,C交换函数的标准写法
{ int temp;
temp=*a;//交换指针指向的对象,而不是指针, *a=*b;
*b=temp;
//指针指向的对象的改变。会影响到那个对象本身
//因为 当对象(变量)地址传递给参数时 *a,*b 就是实参地址中的数据。
}
void jiaohuan( int *a,int *b)
{ int *temp;
temp=a;
a=b;
b=temp;
//不作为返回值的话,指针的改变传不出去;
//函数调用的值传递方式是单向传递,形参(指针)的值,是不会复制回去的。
//而且变量的地址是常量表达式,是不会改变的。
//交换指针的结果,只是在函数jiaohuan内部,临时让两个指针,交换了指向的对象。
//不影响实参地址内部的对象的值,达不到交换的目的。
}
C++ 库定义的交换函数
大致如下:
template<typename T>
void swap(T &a,T&b)//引用传递(也称地址传递)
{//引用参数,代表实参(所引用的对象)本身,所以交换后,实参就改变了。
T t(a);
a = b;
b = t;
}
------解决方案--------------------
这是指针变量和变量的指针问题,下面是我写的两个程序,看了后你会感悟一点:
#include "iostream.h"
int main()
{
int i=3;
int *iptr=&i;
int **iptrptr=&iptr;//iptr也是变量,也能够获取它的地址
cout <<"Address of Var i=" <<iptr <<endl;//输出iptr存储的内容,即i在内存中的地址
cout <<"Data of Var i=" <<*iptr <<endl;//输出iptr所指向的变量
cout <<"Address of Pointer iptr=" <<iptrptr <<endl;//输出iptr在内存中的地址
cout <<"Address of Var i=" <<*iptrptr <<endl;//输出iptrptr所指向的变量,即iptr
*iptr=2+*iptr;//*iptr可以作左值
cout <<"Data of Var i=" <<*iptr <<endl;
return 0;
}
#include<iostream>
using namespace std;
int main(){
int a=1;
const int *p=&a;
int b=2;
p=&b;
cout<<p<<endl;; //输出b的地址
cout<<*p; //这是输出的就是b的值
return 0;
}