c语言传参传地址,c语言传递地址

发布时间:2023-01-07

本文目录一览:

  1. 关于c语言形参实参传地址传数值的问题
  2. c语言传值和传地址
  3. c语言 传值和传地址
  4. 关于c语言的传值和传地址
  5. C语言数组的地址传递和值传递
  6. C语言传值传址的问题

关于c语言形参实参传地址传数值的问题

C语言中函数的参数传递(值传递,地址传递,引用传递)

// 值传递 其实质是将数值传递给其他两个变量,自己变量里面的值并没有改变----所以说是值传递。
#include <stdio.h>
void exchange();
int main(void)
{
    int x, y;
    x = 3;
    y = 4;
    exchange(x, y); // 这就是典型的值传递,它把X,Y的值传递给变量a和b;
    printf("%d %d\n", x, y); // a,b的值进行交换,但是变量X,Y里面的值并没有交换。
    return 0;
}
void exchange(int a, int b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
    printf("%d %d\n", a, b);
}
// 地址传递 (提到地址二字,应该始终明确,C语言中的地址是基于指针的,所以地址传递是一定会用指针的)
#include <stdio.h>
void exchange();
int main(void)
{
    int x, y;
    x = 3;
    y = 4;
    exchange(&x, &y); // 这就是典型的地址传递,它把X,Y变量地址传递给指针a和b;
    printf("%d %d\n", x, y); // *a,*b的值进行交换,就是找到a,b对应的地址交换地址里面的值,其实也就是找到 a,b值进行交换。
    return 0;
}
void exchange(int *a, int *b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
    printf("%d %d\n", *a, *b);
}

c语言传值和传地址

输出: 调用函数前输出结果:

nums[1]=0
nums[2]=0
nums[3]=0
nums[4]=0
value = 0

因为循环变量初值是1,所以nums[0]不会输出

findMax(nums,value); // 调用findMax,vals指向nums开始元素,m=0
i=1;[i=1],i<MAXELS成立,开始循环,vals[i]=1,nums[0,1,0,0,0],输出:vals[1]=1
i++;[i=2],i<MAXELS成立,继续循环,vals[i]=1,nums[0,1,1,0,0],输出:vals[2]=1
i++;[i=3],i<5成立,继续循环,vals[i]=1,nums[0,1,1,1,0],输出:vals[3]=1
i++;[i=4],i<5成立,继续循环,vals[i]=1,nums[0,1,1,1,1],输出:vals[4]=1
i++;[i=5],i<5不成立,结束循环,输出:m=1

函数返回,m被舍弃,输出: 调用函数后输出结果:

nums[1]=1
nums[2]=1
nums[3]=1
nums[4]=1
value = 0

由于子程序中没有计算过m,所以m值一直是初始的1,这个m是函数自己临时定义的变量,用来接收调用者传进来的参数,main函数将vale的值0传递给m,计算完后,函数返回,m被舍弃,不会影响value的值(作为参数,是取value的值来用一下,然后就没有value的事了) 如果想将m的值返回,那么有两种办法:

  • 函数写成:void findMax(int vals[],int *m),然后函数中用到m的地方都改成*m,调用时findMax(nums,&value);
  • 函数写成:int findMax(int vals[],int m),函数最后写return m;调用时value=findMax(nums,value); 如果子程序不需要value作为m的初始值,则可省略第2个参数:int findMax(int vals[]),调用:value=findMax(nums);

c语言 传值和传地址

c语言中数组的实质就是指针,所以函数的参数是数组的话,就是传入了一个指针,也就是传入了一个地址。 主函数向findMax中传了两个参数,vals是传地址,m是传值,所以在findMax函数中,对vals做的改变可以带回到主函数,而对m的赋值却对主函数中的变量value没有任何影响。

关于c语言的传值和传地址

编程中,很多东西要你自己去摸索,才能真正的理解。关于地址与值的问题,其实你自己可以试,把变量的地址输出来看看看是不是一样,比如 printf("%x",a); 这样就是以把变量a的地址用16进制的方式输出来,看看地址到底是怎么一回事。 传值与传地址可以这样理解: 就像我把我写的作文抄了一份给你,你拿去看了之后把有的地方改了,现在我要交作文,而我有一份,所以我直接交了,我交的作文内容并没有变,这就是传值,即值传递。 同理,如果我把我的作文直接给你,你看了后也把有些地方改了,现在我也要交,你只能还给我,我再交,这时我交的就是被你改过的了,这就是传地址,即引用传递。 这只是我的理解,有误的地方还请指正。

C语言数组的地址传递和值传递

  1. 值传递就不写了,顾名思义就是把当前的值传到下一个函数中,变量本身的没有发生任何变化
  2. 指针传递,把当前变量指针传到下一个函数,在另外函数里边修改指针的值会修改当前变量值
#include <stdio.h>
void func(int *p)
{
    *p = 9;
    return;
}
void swap(int *a, int *b) // 交换两个变量的值
{
    int temp = *a;
    *a = *b;
    *b = temp;
}
int main(void)
{
    int a = 0;
    func(&a); // 要修改一个变量,把他的地址传过去
    printf("%d", a); // 9
    int b = 3;
    int c = 4;
    swap(&b, &c);
    return 0;
}

C语言传值传址的问题

首先是C语言的参数传递机制,比如下面这样的一个简单函数

int plus(int a, int b)
{
    return a + b;
}
// 其它函数中调用
z = plus(x, y);

这个函数调用的过程中会进行参数拷贝,也就是说上述代码会被编译成大致如下的样子(以下为伪代码)

int plus()
{
    int a;
    int b; // 函数的参数也是函数的内部变量
    return a + b;
}
// 其它函数中调用
plus:a = x; // 先将参数的值复制给被调用函数内部的参数
plus:b = y; // 同上
z = plus(); // 执行函数

注意到上述过程中,所有函数的参数都是“复制”进去的,也就是说函数内部看见的参数并不是外部传入的参数本身,而是其副本,对副本进行操作(如交换)会失败,因为这些操作无法影响到外部的参数本身。 但如果使用指针传参,例如

void fun(int *a, int *b) // 顺带一提,返回值一定要养成习惯写上
{
    int c;
    c = *a;
    *a = *b;
    *b = c;
}
// 其它函数中调用
fun(&x, &y);

在编译的时候同样遵循参数复制原则,变成如下代码(以下为伪代码)

fun()
{
    int *a;
    int *b; // 参数a,b仍然是函数的内部变量,不过其类型是int*
    int c;
    c = *a;
    *a = *b;
    *b = c;
}
// 其它函数中调用
fun:a = &x; // 将x的地址复制给a
fun:b = &y; // 同上
fun(); // 执行函数

可以看到,参数仍然是“复制”进去的,但要注意,传入的参数x与其参数副本a虽然是两个东西,但他们是指针,存储的地址一样,也就是指向的对象时一样的(都是x),y与b同理,因此在函数内部通过指针a,b寻址就可以访问函数外部的变量x,y,并对其进行交换操作。