服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言形参与实参使用的差别讲解

C语言形参与实参使用的差别讲解

2023-03-01 16:02Elanie1024 C/C++

形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用,形参和实参的功能是作数据传送。发生函数调用时, 主调函数把实参的值传送给被调

前言

如果把函数比喻成一台机器,那么参数就是原材料,返回值就是最终产品;从一定程度上讲,函数的作用就是根据不同的参数产生不同的返回值。

这一节我们先来讲解C语言函数的参数,下一节再讲解C语言函数的返回值。

C语言函数的参数会出现在两个地方,分别是函数定义处和函数调用处,这两个地方的参数是有区别的。

形参(形式参数)

在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参。

实参(实际参数)

函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参。

形参和实参的功能是传递数据,发生函数调用时,实参的值会传递给形参。

形参和实参的区别和联系

1) 形参变量只有在函数被调用时才会分配内存,调用结束后,立刻释放内存,所以形参变量只有在函数内部有效,不能在函数外部使用。

2) 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的数据,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参,所以应该提前用赋值、输入等办法使实参获得确定值。

3) 实参和形参在数量上、类型上、顺序上必须严格一致,否则会发生“类型不匹配”的错误。当然,如果能够进行自动类型转换,或者进行了强制类型转换,那么实参类型也可以不同于形参类型。

4) 函数调用中发生的数据传递是单向的,只能把实参的值传递给形参,而不能把形参的值反向地传递给实参;换句话说,一旦完成数据的传递,实参和形参就再也没有瓜葛了,所以,在函数调用过程中,形参的值发生改变并不会影响实参。

请看下面的例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
//计算从m加到n的值
intsum(int m,int n){
int i;
for(i = m+1; i <= n;++i){
        m += i;
}
return m;
}
intmain(){
int a, b, total;
printf("Input two numbers: ");
scanf("%d %d",&a,&b);
    total =sum(a, b);
printf("a=%d, b=%d\n", a, b);
printf("total=%d\n", total);
return0;
}

运行结果:

Input two numbers: 1 100↙

a=1, b=100

total=5050

在这段代码中,函数定义处的 m、n 是形参,函数调用处的 a、b 是实参。通过 scanf() 可以读取用户输入的数据,并赋值给 a、b,在调用 sum() 函数时,这份数据会传递给形参 m、n。

从运行情况看,输入 a 值为 1,即实参 a 的值为 1,把这个值传递给函数 sum() 后,形参 m 的初始值也为 1,在函数执行过程中,形参 m 的值变为 5050。函数运行结束后,输出实参 a 的值仍为 1,可见实参的值不会随形参的变化而变化。

以上调用 sum() 时是将变量作为函数实参,除此以外,你也可以将常量、表达式、函数返回值作为实参,如下所示:

?
1
2
3
total =sum(10,98);//将常量作为实参
total =sum(a+10, b-3);//将表达式作为实参
total =sum(pow(2,2),abs(-100));//将函数返回值作为实参

5) 形参和实参虽然可以同名,但它们之间是相互独立的,互不影响,因为实参在函数外部有效,而形参在函数内部有效。

更改上面的代码,让实参和形参同名:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
//计算从m加到n的值
intsum(int m,int n){
int i;
for(i = m +1; i <= n;++i){
        m += i;
}
return m;
}
intmain(){
int m, n, total;
printf("Input two numbers: ");
scanf("%d %d",&m,&n);
    total =sum(m, n);
printf("m=%d, n=%d\n", m, n);
printf("total=%d\n", total);
return0;
}

运行结果:

Input two numbers: 1 100

m=1, n=100

total=5050

调用 sum() 函数后,函数内部的形参 m 的值已经发生了变化,而函数外部的实参 m 的值依然保持不变,可见它们是相互独立的两个变量,除了传递参数的一瞬间,其它时候是没有瓜葛的。

到此这篇关于C语言形参与实参使用的差别讲解的文章就介绍到这了,更多相关C语言形参与实参内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/Elanie1024/article/details/128759795

延伸 · 阅读

精彩推荐
  • C/C++C语言设计三子棋小游戏

    C语言设计三子棋小游戏

    这篇文章主要为大家详细介绍了C语言设计三子棋小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    小倪同学 -_-9672021-11-02
  • C/C++QT实战之打开最近图片功能的实现

    QT实战之打开最近图片功能的实现

    这篇文章主要为大家详细介绍了如何利用Qt和QSettings实现打开最近图片功能,文中的示例代码讲解详细,对我们学习QT有一定的帮助,感兴趣的可以了解一下...

    wendy_ya5502022-12-25
  • C/C++C++超详细讲解auto与nullptr的使用

    C++超详细讲解auto与nullptr的使用

    C++11提供了nullptr用来取代0或者NULL。在C++11之前,使用NULL为空指针赋初值,但NULL其实就是0,这时会把NULL当成0来用;在C++11中,我们在声明一个变量或对象...

    Hiland.10352022-12-05
  • C/C++用C++实现单向循环链表的解决方法

    用C++实现单向循环链表的解决方法

    本篇文章是对用C++实现单向循环链表的解决方法进行了详细的分析介绍,需要的朋友参考下...

    C++教程网2142020-12-13
  • C/C++C语言求Fibonacci斐波那契数列通项问题的解法总结

    C语言求Fibonacci斐波那契数列通项问题的解法总结

    斐波那契数列相关问题是考研和ACM中常见的算法题目,这里特地为大家整理了C语言求Fibonacci斐波那契数列通项问题的解法总结,需要的朋友可以参考下...

    Hackbuteer112812021-04-05
  • C/C++c++智能指针的超详细讲解

    c++智能指针的超详细讲解

    c++程序设计中经常会用堆内存,程序员要自己管理内存的申请和释放,使用原始指针,容易造成堆内存泄漏(忘记释放),二次释放,使用智能指针能更好的管理...

    bitcarmanlee5972023-02-14
  • C/C++C++中的vector容器对象学习笔记

    C++中的vector容器对象学习笔记

    这篇文章主要介绍了C++中的vector容器对象学习笔记,其中文章最后标红的resize与reserve方法的差别特别需要注意,需要的朋友可以参考下...

    古典小说网6262021-04-02
  • C/C++浅析C++中cout的运行机制

    浅析C++中cout的运行机制

    关于C++中cout的使用,相信大家再熟悉不过了,然而对于cout是如何输出的?输出的机制是啥,需要进一步的了解。本章娓娓道来。前几天在网上看到这么一...

    C++教程网11452021-01-04