当需要一个形式参数直接改变对应实参的值时,该形式参数应说明为啥参数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当需要一个形式参数直接改变对应实参的值时,该形式参数应说明为啥参数?相关的知识,希望对你有一定的参考价值。

当需要一个形式参数直接改变对应实参的值时,该形式参数应说明为指针类型。

指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,

即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的。任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。

扩展资料

指针传递和引用传递一般适用于:

函数内部修改参数并且希望改动影响调用者。对比指针/引用传递可以将改变由形参“传给”实参(实际上就是直接在实参的内存上修改,

不像值传递将实参的值拷贝到另外的内存地址中才修改)。

另外一种用法是:当一个函数实际需要返回多个值,而只能显式返回一个值时,可以将另外需要返回的变量以指针/引用传递

给函数,这样在函数内部修改并且返回后,调用者可以拿到被修改过后的变量,也相当于一个隐式的返回值传递吧。

参考技术A 使用引用传递。 参考技术B 引用或者指针 参考技术C 引用。 参考技术D 无类型参数,void param;

实验4 数组

实验结论

Θ PART 1~PART 4

¹』数组名作为函数参数时,形参、实参的语法形式书写注意事项,函数调用和参数传递过程。

(1)在变量作函数参数时,所进行的值传送是单向的。即只能从实参传向形参,不能从形参传回实参。形参的初值和实参相同,而形参的值发生改变后,实参并不变化,

  两者的终值是不同的。而当用数组名作函数参数时,情况则不同。由于,实际上形参和实参为同一数组,因此当形参数组发生变化时,实参数组也随之变化。

  当然这种情况不能理解为发生了“双向”的值传递。但从实际情况来看,调用函数之后实参数组的值将由于形参数组值的变化而变化。

(2)用数组名作函数参数时,应该在主调函数和被调函数中分别定义数组,并且要求形参和相对应的实参都必须是类型相同的数组,都必须有明确的数组说明,

  当形参和实参二者不一致时,即会发生错误。

(3)在普通变量或下标变量作函数参数时,形参变量和实参变量是由编译系统分配的两个不同的内存单元。在函数调用时发生的值传送是把实参变量的值赋予形参变量。

(4)数据的传送的实现:由于数组名就是数组的首地址,在数组名作函数参数时所进行的传送只是地址的传送,也就是说把实参数组的首地址赋予形参数组名。

  形参数组名取得该首地址之后,也就等于有了实在的数组。实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。

(5)形参数组也可以不指定大小,定义数组时在数组名后跟一个空的中括号,为了在被调函数中处理数组元素的需要,可以另设一个参数,传递数组元素的个数。

  这些其实是我在网上看的一些资料进行的一个整合? •?•?推荐一个新发现的网站 https://www.csdn.net CSDN专业IT技术社区 可以查到很多资料。

²』对冒泡法排序算法的理解,尤其是边界条件的理解和归纳总结

冒泡法就是对一组数据,相邻两项进行大小比较并按一定条件进行换序再进行不断比较换序,从而将数据按一定的次序排列。

每次最大元素(或最小元素)就像气泡一样“浮”到数组最后,

我在看这段程序的时候觉得每次循环的部分和之前章节中的倒叙输出和三个数中最大值有些相似。

在网上查到有说最后的条件改成 a[ i ] >= a[ i+1 ] 会变得不稳定,写实验仓促,这一点还不是很理解,需要再编程体会一下(●°u°●)? 

Θ PART 5

 Ü 练习1 : 补全程序,查找一组整型数据的最大值,程序补全如下↓

// 功能描述:输入一组整数,输出最大值
#include <stdio.h>
int findMax(int a[], int n);
const int N=5;
int main()
{
    int a[N];
    int max, i;
    printf("输入%d个整数: \\n", N);
    for(i=0;i<5;i++)
        scanf("%d",&a[i]);
    max=findMax(a,N);
    printf("数组a中最大元素值为: %d\\n\\n", max);
    return 0;
}
int findMax(int a[], int n)
{
    int i,j,t;
    for(i=0;i<n-1;i++)
        for(j=0;j<n-1-i;j++)
        {
            if(a[j]>a[j+1])
            {
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
    return a[i];
}

运行结果↓

技术图片

 

Ü 练习2:补全程序,使用冒泡法对字符数组由大到小排序,程序源码如下↓

#include<stdio.h>
const int N=4;
void output(char x[],int n);
void f(char x[],int n);
int main()
{
    char string[N]={2,0,1,9};
    int i;
    printf("排序前: \\n");
    output(string,N);
    f(string,N);
    printf("\\n排序后: \\n");   
    output(string, N);
    printf("\\n");
    return 0;
}
void output(char x[],int n)
{
    int i;
    for(i=0;i<N;i++)
    printf("%c",x[i]);
}
void f(char x[],int n)
{
    int i,j,t;
    for(i=0;i<n-1;i++)
    for(j=0;j<n-1-i;j++)
    {
        if(x[j]<x[j+1])
        {
            t=x[j];
            x[j]=x[j+1];
            x[j+1]=t;
        }
    }

}

运行结果↓

技术图片

 

实验总结与体会

首先这次的实验最大的变化在篇幅上,与之前的三篇实验相比,这一篇是十分的简短了,我仅写出了实验结论里所要求的内容,对验证性的实验没有罗列出来。

这个改变一是我在上次实验的互评中看到大家的实验报告精简清晰,觉得自己的每篇报告都含水量太大,内容过于繁重,就进行了简化;

二是由于高数考试和提前的deadline让本篇报告十分仓促,没有合理安排时间真的很不好_(:_」∠)_

互评链接还是会以评论的方式附在本篇实验之后☆?

 

以上是关于当需要一个形式参数直接改变对应实参的值时,该形式参数应说明为啥参数?的主要内容,如果未能解决你的问题,请参考以下文章

c语言中形参和实参的区别是啥?

形参的形参和实参的关系

参数传递辨析

调用函数时为啥形参的值不能传给实参

c语言中形参和实参的区别?

形参和实参的区别