当前位置:首页 » 编程语言 » c语言值传递指针传递的区别
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言值传递指针传递的区别

发布时间: 2022-08-28 05:07:15

c语言的传值与传指针的问题

c语言中指针即地址,地址的传值可以引起参数的变化。
比如:
&x,
&y是取这两个变量的地址,作用空间在main函数里。然后函数调用把这两个变量的地址传递到函数myadd中,在函数中的*a和*b分别是引用地址指向的变量值,等于是取到了x,y本身的值。在myadd中直接操作*a可以改变x的值。
通俗来说因为&x,&y表示的是x,y的地址。所以传递的是地址。意思就是说,函数可以通过地址引用变量。

② c语言中常出现 "值传递" "地址传递" "数组传递" 等概念 它们是什么意思 有什么异同点

1一般函数的形参和实参之间是值传递,传递的是数值,但不改变实参;2有指针参与的是 地址传递,就是赋予地址值,可以改变实参;3数组传递用于指针数组,和2的理解差不多;

③ 简述什么是值传递,什么是地址传递,两者区别

值传递,传入变量的数值,函数不能改变变量的数值;地址传递,传入变量的地址,函数可以根据变量地址,访问变量,自然就能改变变量的值;数组传递,由于c语言数组和指针的处理方式一样,数组传递就等同于地址传递,函数可以根据地址,访问数组元素,自然就能改变数组元素的值。 #include "stdio.h"void fun1(int a)
{
a=1000;
}void fun2(int *p)
{
*p=1000;
}void fun3(int b[])
{
b[0]=1000;
b[1]=2000;
}void main()
{
int a=99;
int b[2]={1,2};
printf("a=%d\n",a);
fun1(a);/*值传递*/
printf("a=%d\n",a); fun2(&a);/*地址传递*/
printf("a=%d\n",a); printf("b[0]=%d b[1]=%d\n",b[0],b[1]);
fun3(b);/*数组传递*/
printf("b[0]=%d b[1]=%d\n",b[0],b[1]);}

④ 1. 用普通,指针和引用三种方法实现传递参数,他们的区别是什么,他们的特点是什么

先来个概括~~~
C语言中,所有的函数调用传参,都是传递的一个值!不一样的是,我们能利用这个值做什么!

1. 普通传参
比如 int test(int a),此处,传递一个int型数据a,我们获得的是一个int型的值,比如5,仅仅只是一个int

数值,获取不了传参时那个变量的地址!比如
int a = 5;
int *p = &a; // 【1】 &a
test(a);在test函数中,无法获取a这个变量的地址,就是【1】,仅仅得到了5这个值

2. 指针传递
int test(int *p);
此处传递的是,一个整形变量的内存地址,其实也是一个int数值,内存地址使用int型变量保存,比如0x77777,

就是一个int数值。
int a = 5;
int *p = &a; // 【2】 假设为0x77777
test( p );
此时,我们在test函数中,就可以根据p保存的地址0x77777来修改这个内存单元中的值,就达到了修改a的目的



3. 引用传递
int a = 5;
int &b = a; // a的引用
这个其实类似第2种方法,也是传递了地址,b相当于给a取了一个别名。
谭浩强书中所指的值传递和引用传递其实都是值传递,那样写书确实误导新手。。。。

11: int a = 5;
00401578 mov dword ptr [ebp-4],5 ; 将5写入a那个int内存单元

12: int &b = a;
0040157F lea eax,[ebp-4] ; 获取a的地址
00401582 mov dword ptr [ebp-8],eax ; 【3】 此处类似【2】中,定义一个指针指向a的内存单元

⑤ 在C语言中,1、数组和指针的参数传递在过程和结果上有什么区别,2、在使用时需要使用return么

结果应该没有区别,传递的时候都是进行地址传递,只是数组在使用下标的时候会进行值传递。地址传递时不用return语句。

⑥ 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#中,当你传指针的时候,实际上你传的是指针所指向的地址值,也就是把地址值传过去,但是这个地址值也是通过值传递过去的,即函数内的指针指向的地址值是原来的地址值的一个拷贝,但是由于地址值相同,所以你在函数内对该指针进行解指针并进行修改,你也修改了外部的那个指针的值(注意,修改的不是地址值)
*p
=
30;
那么主函数内的值也变成了30,因为是对同一个地址存放的数据进行了操作

⑨ C语言,指针,地址值的传递

c语言中指针即地址,地址的传值可以引起参数的变化。
比如:
&x, &y是取这两个变量的地址,他们的作用空间在main函数里。然后函数调用把这两个变量的地址传递到函数myadd中,在函数中的*a和*b分别是引用地址指向的变量值,等于是取到了x,y本身的值。在myadd中直接操作*a可以改变x的值。
通俗来说因为&x,&y表示的是x,y的地址。所以传递的是地址。意思就是说,函数可以通过地址引用变量。