c语言 -> 函数值传入探究

在做c语言题目的时候,发现一个挺有意思的现象:当往一个函数中传入数组时,传入 a[],
*a, a[x](x为数组长度),函数都能正常运行;讲道理传入的函数类型都不一样,怎么又能得
到一样的结果呢?
下面就写一个程序来看看编译器到底是怎么处理的:

#include <stdio.h>
#include <stdlib.h>
//void printfArray(int a[7], int num)       //以a[7]传入函数后长度与以a[]传入相同
//void printfArray(int a[], int num)
void printfArray(int *a, int num)
{
    int i = 0;
    int num2 = 0;
    //查看传入数组的本质
    num2 = sizeof(a) / sizeof(a[0]);
    printf("当数组作为形参传入函数中,长度:num2 == %d\n", num2);

    for (i = 0; i < num; i++)
    {
        printf(" %d ", a[i]);
    }
    printf("\n\n");
}

//void sortArray(int a[7], int num)
//void sortArray(int a[], int num)
void sortArray(int *a, int num)
{
    int i = 0;
    int j = 0;
    int tmp;
    int num2 = 0;
    //查看传入数组的本质
    num2 = sizeof(a) / sizeof(a[0]);
    printf("当数组作为形参传入函数中,长度:num2 == %d\n\n", num2);
    //实参a 和形参a的数据类型本质不一样
    //形参中的数组,编译器会把它当作指针处理(c语言特色)

    for(i = 0; i < num; i++)      //冒泡排序
    {
        for(j = 0; j < num; j++)
        {
            if(a[i] > a[j])
            {
                tmp = a[i];
                a[i] = a[j];
                a[j] = tmp;
            }
        }
    }
    //return a;
}

//数组做函数参数的返回问题,返回为一个指针
//把数组的内存首地址和数组的有效长度传给被调用函数
int main()
{
    int num = 0;
    int a[] = {1, 0, 3, 6, 8, 6, 9};
    num = sizeof(a) / sizeof(a[0]);
    printf(" num == %d\n", num);


    printf("排序之前:");
    printfArray(a, num);

    sortArray(a, num);
    printf("排序之后:");
    printfArray(a, num);
    printf("Hello world!\n");
    return 0;
}

我们可以看到,无论是以哪一种作为形参传入函数(a[], *a, a[x]),在函数内部所得到的数据长度
都为1,换句话说,我们传入函数的仅仅是指向数组首地址的一个指针而已。

为什么要这么做呢?其实换一个角度也许会好理解些: c语言相比于其他语言的特点有:能通过指
针直接对内存进行操作,运行速度快等;那么如果我真要传一个数组进去,自然程序运行速度就会
有所下降。

猜你喜欢

转载自blog.csdn.net/desporado/article/details/80031054