同样但为什么工作不同?

时间:2016-06-26 05:52:46

标签: c

我们知道参数接收参数,即我们正在为参数分配参数。如果是这样,为什么此语句int b[5]=a;生成一个名为invalid initializer和func(a);的错误是正常的?

#include<stdio.h>

void func(int b[5]);

int main(void)
{
    int a[5]={1,2,3,4,5};
    int b[5]=a;
    func(a);
    return 0;
}

void func(int b[5])
{

}

2 个答案:

答案 0 :(得分:4)

在C中,数组衰减到指向您正在使用它的上下文中的数组的第一个元素的指针。

int b[5] = a;

相当于:

int b[5] = &a[0];

指向int的指针不能用于初始化int的数组。

要将b的元素设置为与a的元素相同,您可以选择以下选项。

  1. 稍微初始化b

    int b[5] = {a[0], a[1], a[2], a[3], a[4]};
    
  2. 使用memcpy

    int b[5];
    memcpy(b, a, sizeof(a));
    
  3. 逐个复制a的元素。

    int b[5];
    for (int i = 0; i < 5; ++i )
       b[i] = a[i];
    
  4. 我个人的偏好是使用memcpy

答案 1 :(得分:3)

  

为什么此语句int b[5]=a;会生成一个名为invalid initializer

的错误

你正在做两件事:

  • 定义5个整数的数组b

  • 将数组b初始化为数组a。你无法在C中执行此操作。具体而言,该语句永远不会像您期望的那样将b[0]初始化为a[0],将b[1]初始化为a[1]等。为此,您需要memcpy( b, a, sizeof( b ) )

  

void * memcpy ( void * destination, const void * source, size_t num );

将num指向的位置的num个字节的值直接复制到目标指向的内存块。

  

void func(int b[5])

这个函数只是将一个数组作为参数 - 这里没有数组赋值。

你实际上应该把它写成(不需要数组大小):

void func(int b[])