详解C语言实参与形参的区别


基本概念

相信大家对形参与实参两个概念已经见多不怪了,这里我们再来加深一下印象或理解。
实参:所谓实参就是实际在内存中开辟了的空间的变量参数。
形参:指的是函数的参数,之所以叫形参,是因为只有在函数被调用的时候才会给该变量在中开辟空间,并将实参拷贝给形参

案例1

这里我就直接上指针了,大家搞懂了指针,一切且懂,请看如下代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void  func(char * buffer){
    printf("%x\n",buffer);
    if(buffer){
        free(buffer);
        buffer=NULL;
    }
    return ;
}   
int main(){
    char *buf=NULL;
    printf("%x\n",buf);
    buf =(char *)malloc(100);
    if(buf==NULL){
        printf("test_1\n");
    }
    func(buf);
    if(buf==NULL){
        printf("test_2");
    }else{
        printf("test_3");
    }
    return 0;
}

最后程序的打印结果是什么呢?

案例2

请看如下代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void swap(int * a,int *b)
{
    int *temp;
    temp = a;
    a=b;
    b=temp;
    printf("%d %d\n",*a,*b);
    return ;
}  
int main(){
    int a=6;
    int b=10;
    int *p,*q;
    p=&a;
    q=&b;
    swap(p,q);
    printf("%d %d\n",*p,*q);
    return 0;
}

这段代码的输出结果又是多少呢?

答案

案例1:

答案:test_3
分析如下:
我们在堆上成果申请了100个字节大小的空间,malloc函数会返回申请成功的堆地址上的地址,所以肯定是不会打印test_1的,然后我们调用函数func,去释放形参buffer,这段在堆上的空间肯定是被释放了的。且buffer被置空了,但是关我们buf有什么关系,所以buf不为NULL,答案就是test_3
在这里插入图片描述

案例2

答案:
10 6
6 10
原理同案例1,抓住实参和形参的关系把握在内容拷贝就OK

在这里插入图片描述


版权声明:本文为m0_56145255原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。