c语言中的值传递和地址传递,怎么区分C语言里的按值传递与按址传递

1,怎么区分C语言里的按值传递与按址传递有两种方法可以实现地址传递一个是指针,另一个是引用,就是在变量前加&.值传递就是普通用变量名就可以了 。都是值传递,真正的引用传递是出现在c#中,当你传指针的时候,实际上你传的是指针所指向的地址值,也就是把地址值传过去,但是这个地址值也是通过值传递过去的,即函数内的指针指向的地址值是原来的地址值的一个拷贝 , 但是由于地址值相同,所以你在函数内对该指针进行解指针并进行修改,你也修改了外部的那个指针的值(注意,修改的不是地址值)*p = 30;那么主函数内的值也变成了30,因为是对同一个地址存放的数据进行了操作按地址传递形参是要用到指针的按地址传递形参才能改变实参 。可以改变两个数的大小 。我很清楚的记得,老师(教授)说"函数之间的传递都是值的传递",而且他特别的强调了"指针的传递,实际上也是值的传递,它只是把地址的值传递了过去".呵呵~~ 在实际用当中,我也体会到了,也很好的理解了他的这句话哦~~
2,C语言中的值传递和址传递都是值传递,真正的引用传递是出现在C#中,当你传指针的时候,实际上你传的是指针所指向的地址值,也就是把地址值传过去,但是这个地址值也是通过值传递过去的,即函数内的指针指向的地址值是原来的地址值的一个拷贝,但是由于地址值相同,所以你在函数内对该指针进行解指针并进行修改,你也修改了外部的那个指针的值(注意,修改的不是地址值)*p = 30;那么主函数内的值也变成了30,因为是对同一个地址存放的数据进行了操作void func01(unsigned int Val);//是传值方式void func02(unsigned int *pV);//是传址方式---------------------------------------------unsigned int X;unsigned int *p;X=10;p = &X;//应用1func01(X);func02(&X);//应用2func01(*p);func02(p);void func(int *a,int b[]) 和void func(int a,int b[]) 的区别是:前者a传递的是指针 , 后者a是值传递;但b都是地址传递,因为在参数列表中int b[]相当与int *b问题是你修改的是b[0]的值,所以a是值传递和地址传递是没有影响的 。如果想输出b[0]=3,void func(int a,int b)a=b+6;}main() a=0;b[0]=3; func(a,b[0]); printf("%d\n",b[0]);}
3,C语言关于值传递与地址传递的问题来晚了 上面的 回答都说到了不知道是否是LZ需要的因为第一个程序是值传递,只是在swap()函数中进行了值的交换,如果在swap中输出结果是正确的,但是回到main()函数后,原来的值没有变 。比如a=1,b=2,a在内存中的地址是1000,b的地址是2000,在进行 temp=&a; &a=&b; &b=temp; 运算以后,a的地址是多少,值是多少?b的地址是多少,值是多少?? 这个变量名称和值、地址的关系是怎么样的?? 这个地址传递,在交换后等于a b的指针交换了,a地址2000值 2b地址1000值 1编程中,很多东西要你自己去摸索,才能真正的理解 。关于地址与值的问题,其实你自己可以试,把变量的地址输出来看看看是不是一样,比如 printf("%x",&a); 这样就是以把变量a的地址用16进制的方式输出来,看看地址到底是怎么一回事 。传值与传地址可以这样理解:就像我把我写的作文抄了一份给你,你拿去看了之后把有的地方改了,现在我要交作文,而我有一份,所以我直接交了,我交的作文内容并没有变,这就是传值,即值传递 。同理 , 如果我把我的作文直接给你 , 你看了后也把有些地方改了,现在我也要交,你只能还给我,我再交,这时我交的就是被你改过的了 , 这就是传地址,即引用传递 。这只是我的理解,有误的地方还请指正 。这就是传值 的一个特性,系统把参数的值,压到堆栈里面,传入到函数内函数内的变量,都是临时变量,改变后,也不会传递出来,也传递不出来传地址则不同,把地址传到函数内以后,函数修改了这个地址里面的 内容了所以 , 退出函数后,虽然传入的地址不会传递出来,但改变的内容已经改变了temp=&a; &a=&b; &b=temp; 这种写法是不对的,不能&a=&b;不能这样取地址,然后把地址赋值给地址,可以赋值给变量lfm13720打的比方我是第一次看到 , 不错,很形象 。【c语言中的值传递和地址传递,怎么区分C语言里的按值传递与按址传递】
4,C语言值传递和地址传递 不明白1)void swap(int a, int b)的参数属于值传递;2)值传递需要一个中间变量,以你的程序为例: swap(x,y); 它的实际过程是,先分配两个临时变量,a和b,这两个变量和传入的x、y占用不同的地址空间,程序先将x和y的值复制给a和b: swap(a = x, b = y),之后在swap中所有的操作都是针对a和b进行的 , 与x和y无关,所以x和y的值在swap执行后依然保持不变 。3)地址传递也需要一个中间变量,但是这个中间变量保存的是地址 , 对于C语言你就需要用到指针变量,它可以保存一个普通变量的地址,通过改变这个地址里的内容就可以改变原变量的值 。对于你的程序,如果想在调用swap后 , x和y的值被改变,你需要定义成下面的样子:#include <stdio.h>void swap(int *,int *);//参数里的*号表示指针void main()int x=10,y=20;printf("(1)a=%d y=%d\n",x,y);swap(&x,&y);//x和y按地址传入printf("(4)x=%d y=%d\n",x,y);//按地址传入 , x和y的值被swap改变}void swap(int *pa, int *pb)//函数形参变成指针int t;printf("(2)a=%d b=%d\n",*pa,*pb); //访问指针的内容需要在指针前加*号t=*pa;*pa=*pb;*pb=t;printf("(3)a=%d b=%d\n",*pa,*pb);}}3)关于指针的详细内容 , 由于篇幅有限,请参看C语言资料的相关章节 。void swap (int a,int b)里的a和b都是值传递 。值传递意味着,void main()在调用swap(x,y)时,是将x变量和y变量拷贝了一个副本,然后将副本传给swap作为a变量和b变量 。传入时,从数值上来讲,有a=x和b=y;但是当a、b的数值发生改变时,x、y的数值是不会变化的 。void func(int *a,int b[]) 和void func(int a,int b[]) 的区别是:前者a传递的是指针,后者a是值传递;但b都是地址传递,因为在参数列表中int b[]相当与int *b问题是你修改的是b[0]的值,所以a是值传递和地址传递是没有影响的 。如果想输出b[0]=3,void func(int a,int b)a=b+6;}main() a=0;b[0]=3; func(a,b[0]); printf("%d\n",b[0]);}5 , 关于c语言的传值和传地址编程中,很多东西要你自己去摸索,才能真正的理解 。关于地址与值的问题,其实你自己可以试,把变量的地址输出来看看看是不是一样,比如 printf("%x",&a); 这样就是以把变量a的地址用16进制的方式输出来,看看地址到底是怎么一回事 。传值与传地址可以这样理解:就像我把我写的作文抄了一份给你,你拿去看了之后把有的地方改了 , 现在我要交作文,而我有一份,所以我直接交了,我交的作文内容并没有变,这就是传值,即值传递 。同理,如果我把我的作文直接给你,你看了后也把有些地方改了 , 现在我也要交,你只能还给我,我再交,这时我交的就是被你改过的了,这就是传地址 , 即引用传递 。这只是我的理解 , 有误的地方还请指正 。给你来点通俗点的:有个关键的东西你没有考虑到,函数里的a与函数外的a并不是一个a , 请看:int a = 3;int b = 5;void fun(int *a,int *b) int *c;// 1 c=a;// 2 a=b;// 3 b=c;// 4}fun( &a, &b );我们来看一下,运行1 , 2,3 , 4句话的结果1.int *c;+ &a 0x00424a30 int a+ &b 0x00424a34 int b+ a 0x00424a30 int a+ b 0x00424a34 int b+ c 0xcccccccc2. c=a;+ &a 0x00424a30 int a+ &b 0x00424a34 int b+ a 0x00424a30 int a+ b 0x00424a34 int b+ c 0x00424a30 int a<--改变3. a=b;+ &a 0x00424a30 int a+ &b 0x00424a34 int b+ a 0x00424a34 int b<--改变+ b 0x00424a34 int b+ c 0x00424a30 int a4. b=c;+ &a 0x00424a30 int a+ &b 0x00424a34 int b+ a 0x00424a34 int b+ b 0x00424a30 int a<--改变+ c 0x00424a30 int a从上面的调试结果可以看出来 , &a &b的值一直没有改变 , 在改变的只是函数内部a b的值 。一旦函数结束 , a, b的值是不是还是没有改变? 在进入fun之前 , 会有个拷贝的过程 a <-> &a, b <-> &b,很多时候都是会将外部变量和参数写成一样,就很容易造成困扰,其实函数内外根本不是一个东西 。a 和 &a 都指向同一个地址是没有错,但你把a的指向改变下 , &a的指向你可是没有变吧 。换一下,用 *a 和 a来比较 a指向的那个内容就是a,修改*a就是修改a 所以在一些情况下(如com中),就会有一些函数的参数是 void** ppobj,只有这样才能将传进去的一个指针的值改变 。