当前位置:   article > 正文

C语言函数参数传递详解_c语言参数传递

c语言参数传递

1.值传递和地址传递

  (1)值传递:即按“值(如数字10)”传递参数,是将实参变量的值复制一个到临时存储单元中(该存储单元会随着调用的函数运行结束而释放掉),如果在调用过程中改变了形参的值,不会影响实参变量本身,即实参变量保持调用前的值不变

 (2)地址传递:即按“地址(如0019FEDC)”传递参数,把实参变量的地址传送给被调用函数,形参和实参共用内存的同一地址。在被调用过程中,形参的值一旦改变,相应实参的值也跟着改变

注:值传递在函数调用过程中会为形参重新开辟空间,形参与实参分别占用不同的地址空间,而地址传递,形参和实参共用同一内存地址

举栗子:

①值传递(普通类型变量的参数传递)
void fun1(int a){
    a=2;
    printf("在fun1函数中,变量a值的地址是:%p\n",&a);
    a=a+1;
}
void main(){
    int n=1;
    printf("在main函数中,变量n的地址是:%p\n",&n);
    fun1(n);
    printf("fun1函数中形参a加1之后,实参n的值是%d\n",n);//n的值任然不变还是1
}

运行结果

②地址传递(指针作为参数)

void fun2(int *q){
    printf("在fun2函数中q的值是(和m的地址,p的值一样):%p\n",q);
    *q=*q+5;
}

void main(){
    int m=10;
    int *p=&m;
    printf("在main函数中,m值的地址:%p\n",&m);
    printf("在main函数中,p指针的值(p所指向变量的地址):%p\n",p);
    printf("在main函数中,p指针的地址(指针变量本身也要占存储单元):%p\n",&p);
    fun2(p);//传的是p的值,该值是m的地址
    printf("执行fun2函数后,m的值是(由于形参和实参共用内存的同一地址,形参改变实参也改变):%d\n",m);
}

注:当 “ * ” 有两个作用 。作用一(定义指针变量):int *p;   作用二(取值):int m=10;  int p=&m;  printf(*p)//输出10

运行结果

③数组名的参数传递

“数组名的值”和数组的地址都存储了数组的首地址

void fun3(int arr[]){
    for(int i=0;i<5;i++){
        printf("%d",arr[i]);
    }
}
void fun4(int *arr){
    for(int i=0;i<5;i++){
        printf("%d",arr[i]);
    }
}

void main(){

        int arr[5]={1,3,5,7,9};
        int*r;
        r=arr;
        fun3(arr);//传数组名
        printf("\n");
        fun4(r);//传递指针
        printf("\n");
        printf("数组名的值:%p\n",arr);
        printf("数组的地址值:%p\n",&arr);
}

运行结果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AI数据灵魂/article/detail/63100
推荐阅读
相关标签
  

闽ICP备14008679号