将数组传递给函数

时间:2013-08-03 15:52:45

标签: c arrays

当我们将数组作为参数传递时,我们接受它作为指针,即:

func(array);//In main I invoke the function array of type int and size 5

void func(int *arr)

or

void fun(int arr[])//As we know arr[] gets converted int *arr

此处基地址存储在arr

但是当以这种方式接受传递的数组时:

void func(int arr[5])//Works fine.

是否为arr [5]分配了内存?

如果是,那会发生什么?

如果不是,为什么不分配内存?

4 个答案:

答案 0 :(得分:3)

void func(int *arr)
void func(int arr[])
void func(int arr[5])

在C中都是等效的。

C表示类型数组的参数已调整为类型指针。

答案 1 :(得分:3)

  

是否为arr [5]分配了内存?

不,它没有。

  

如果不是,为什么没有分配内存?

因为没有必要。数组传递给函数时,总是衰减成指针。因此,虽然数组不是指针而指针不是数组,但在函数参数中,以下代码段是等效的:

T1 function(T2 *arg);
T1 function(T2 arg[]);
T1 function(T2 arg[N]);

答案 2 :(得分:0)

在参数声明中放置数组大小时,数字将被完全忽略。换句话说

void foo(int x[5]);

完全相同
void foo(int *x);

答案 3 :(得分:0)

希望以下代码/评论有所帮助。编码C时,程序员必须确保许多项目在各种程序中一致。这既是C语言编程的乐趣,也是编程的祸根。

请注意。在参数列表中定义int arr[5]不会为正在传递的数据分配存储空间。该声明有效并得到认可,但仅限于它允许编译器执行其类型检查。虽然,编译器确实在调用函数时分配存储,但存储不存储您的数据。您必须通过显式声明(如以下示例中的main)分配数据,或者您需要发出malloc语句。

我在Eclipse / Microsoft C编译器中运行了以下代码,并且NO语句被标记为警告或错误。

    //In main invoke the functions all referring the same array of type int and size 5

    void func1(int *arr)
    { // arr is a pointer to an int.  The int can be the first element
      // of an array or not.  The compiler has no way to tell what the truth is.
    }

    void func2(int arr[])
    { // arr is a pointer to an array of integers, the compiler can check this
      // by looking at the caller's code.  It was no way to check if the number
      // of entries in the array is correct.
    }

    void func3(int arr[5])
    { // arr is a pointer to an array of 5 integers.  The compiler can
      // check that it's length is 5, but if you choose to overrun the
      // array then the compiler won't stop you.  This is why func1 and func2
      // will work with arr as a pointer to an array of ints.
    }

    void main()
    {
      int data_array[5] = {2,3,5,7,11};

      func1(data_array);

      func2(data_array);

      func3(data_array);

    }

希望这有帮助,请询问更多信息。