① c语言中,实参向形参传递时,什么时候用单向值传递,什么时候用地址传递
C语言在形参和实参之间传递的不仅是值传递,也包括地址传递的。
细节如下:
C语言函数参数传递包括按值传递和按地址传递两种;
当形式参数是数组、指针时都是使用的按地址传递。
② 谁解释C语言中什么是值传递和地址传递
本质上都是值传递,因为传递的都是数值,地址也是用数值表示的。如果从作用上分类,值传递传送的是内存单元中存放的数据,这个数据是接收方要直接使用的,地址传递传送的是内存单元的地址(其实这个地址也是存放在某个内存单元中的),这个数据是给接收方间接使用的,因为它指向另一个内存单元,而这个被指向单元里的数据才是最终需要的。比方一下你就明白了:有两个抽屉AB,A和B中都有你要的东西,但抽屉在我这里,我把A里面的东西直接给你就是值传递,我把B的钥匙给你就是地址传递。
③ C语言的值传递和地址传递
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()
{int a,b[5];
a=0;b[0]=3;
func(a,b[0]);
printf("%d\n",b[0]);
}
④ C语言中的值传递和地址传递
都是值传递,真正的引用传递是出现在C#中,当你传指针的时候,实际上你传的是指针所指向的地址值,也就是把地址值传过去,但是这个地址值也是通过值传递过去的,即函数内的指针指向的地址值是原来的地址值的一个拷贝,但是由于地址值相同,所以你在函数内对该指针进行解指针并进行修改,你也修改了外部的那个指针的值(注意,修改的不是地址值)
*p
=
30;
那么主函数内的值也变成了30,因为是对同一个地址存放的数据进行了操作
⑤ c语言中常出现 "值传递" "地址传递" "数组传递" 等概念 它们是什么意思 有什么异同点
1一般函数的形参和实参之间是值传递,传递的是数值,但不改变实参;2有指针参与的是 地址传递,就是赋予地址值,可以改变实参;3数组传递用于指针数组,和2的理解差不多;
⑥ C语言 值传递和地址传递
#include<stdio.h>
#include<stdlib.h>
main()
{doublea[2]={1.1,2.2},b[2]={10.0,20.0},*s=a;//这里s指向a
fun(a,b,s);
printf("%5.2f ",*s);
}
voidfun(double*p1,double*p2,double*s)
{s=(double*)calloc(1,sizeof(double));//这里s重新指向一个新地址
*s=*p1+*(p2+1);//在新地址中赋值,与main中的a没有任何关系
}
⑦ 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
",x,y);
swap(&x,&y);//x和y按地址传入
printf("(4)x=%d y=%d
",x,y);//按地址传入,x和y的值被swap改变
}
void swap(int *pa, int *pb)//函数形参变成指针
{
int t;
printf("(2)a=%d b=%d
",*pa,*pb); //访问指针的内容需要在指针前加*号
t=*pa;
*pa=*pb;
*pb=t;
printf("(3)a=%d b=%d
",*pa,*pb);
}
}
3)关于指针的详细内容,由于篇幅有限,请参看C语言资料的相关章节。
⑧ C语言:哪些是值传递哪些是地址传递
C语言没有真正意义的地址传递,即使传递指针也只是传递的指针的值,
比如这里加入b 的地址是0x ffff;
实际上在point 函数内是产生了另一个名为p的指针, p 指向0x ffff ( 这个p 只是和main函数的p值相同而已,不是同一个。所以传递指针其实是传递的地址的值,还是值传递)
因此p + 3 不会影响main 函数的p, 如果要改变main的p, 必须:
Point(char** p)
{
*p += 3;
}
调用:
*p = b;
Point(&p);
总之,改变指针的值用二级指针(更高一级的指针,即该指针的地址)。
⑨ C语言的值传递和地址传递有啥区别
两者其实传递的都是一个内存单元的内容。不同的是,值传递传递的内容是一个变量的值,得到这个值后,对这个值得修改不能改变原变量的值;而地址传递传递的是一个变量的地址,得到传递的地址值后,可以通过这个地址直接访问地址对应的那个变量,进而修改那个变量的值。
⑩ c语言程序设计中哪些是按值传递,哪些是按地址传递
其实C语言中函数参数的传递 全 是 值传递
所谓的 地址 传递,只不过是程序员那么称呼他们而已
比如函数: int func(int input);
如果我把 input当做普通值使用( 例如:printf("%d\n",input); )它就是一整形
如果我把 input当做一指针使用( 例如: *((int*)input) = 5; )它就是一指针,
但是你自己要明白:
1.调用函数传的是什么值,用于什么作用,
2.被调用函数中如何使用这个参数