数组名(首元素地址)---指针---实际参数、形式参数---传递


        由于数组名代表的是数组的首地址(数组第一个元素在内存中的地址,等价于指针),因此当“数组名”作为函数的参数时(即数组名作为被调用函数的形式参数和main函数的实际参数时),在被调用函数中对形式参数数组的改变,会影响到实际参数数组的值。

备注:被调用函数在结束调用后,会被释放;因此,形式参数不会影响实际参数的值;但是,当形式参数是指向实际参数的指针时,通过改变内存中存储的值,而使得实际参数的值发生改变。

/*
*copyright(c) 2018,HH
*All rights reserved.
*作 者:HH
*完成日期:2018年7月16日
*版本号:v1.0
*
*问题描:;数组名vs数组首元素地址vs实际参数、形式参数的传递
*输入描述:;
*程序输出:
*/

#include <stdio.h>
void fun(int a[])//数组名作为形式参数
{
    int i;
    for(i=0; i<2; i++)
    a[i]=a[i]*10;
}
int main()
{
    int b[2]= {2,4};
    printf("%d\t%d\n", b[0], b[1]);
    fun(b);//实际参数为数组名
    printf("%d\t%d\n", b[0], b[1]);
    return 0;
}

/*
*copyright(c) 2018,HH
*All rights reserved.
*作 者:HH
*完成日期:2018年7月16日
*版本号:v1.0
*
*问题描:;数组名vs数组首元素地址vs实际参数、形式参数的传递
*输入描述:;
*程序输出:
*/

#include <stdio.h>
void bubblesort(int a[],int n);
int main()
{
    int i;
    int d[10]={9,8,7,6,5,4,3,2,1,0};
    bubblesort(d,10);
    for(i=0;i<10;i++)
    {
        printf("%d ",d[i]);
    }
    return 0;
}
void bubblesort(int a[],int n)
{
    int i,j,t;
    for(i=0;i<n-1;i++)//控制每个元素的交换次数的最大值
    {
        for(j=0;j<n-1-i;j++)//此处写成“j<=n-1-i”会造成数组越界,即a[9]会与a[10]交换//控制一个元素的交换次数
        {
            if(a[j]>a[j+1])
            {
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
    }
    return;
}

紧接着后一个程序的注释很关键,说明了数组名,指针,首元素地址的关系

以及数组元素越界会造成错误

/*
*copyright(c) 2018,HH
*All rights reserved.
*作 者:HH
*完成日期:2018年7月16日
*版本号:v1.0
*
*问题描:;数组名vs数组首元素地址vs实际参数、形式参数的传递
*输入描述:;
*程序输出:
*/

#include <stdio.h>
#define n 10
void bubblesort(int a[]);//函数声明,以数组名为形式参数
int main()
{
    int i;
    int d[n]={9,8,7,6,5,4,3,2,1,0};
    //bubblesort(d);//数组名==指针==首元素地址
    bubblesort(&d[0]);//运算结果同上一行,因为数组名==首元素地址,指针
    //bubblesort(&d[1]);//结果会造成数组越界!!
    //bubblesort(d[]);//!!!编译错误,因为被调用函数的形参对象是数组名,而不是数组!!!
    for(i=0;i<n;i++)
    {
        printf("%d ",d[i]);
    }
    return 0;
}
void bubblesort(int a[])
{
    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;
}



猜你喜欢

转载自blog.csdn.net/pl0020/article/details/81066545