C 相同,但为什么工作方式不同?

C 相同,但为什么工作方式不同?,c,C,我们知道参数接收参数,也就是说,我们将参数分配给参数。如果是,为什么这个语句int b[5]=a;生成名为无效初始值设定项和funca的错误;还好吗 #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]) { } 在C语言中,数组衰减为指向

我们知道参数接收参数,也就是说,我们将参数分配给参数。如果是,为什么这个语句int b[5]=a;生成名为无效初始值设定项和funca的错误;还好吗

#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])
{

}

在C语言中,数组衰减为指向使用它的上下文中数组的第一个元素的指针

int b[5] = a;
相当于:

int b[5] = &a[0];
指向int的指针不能用于初始化int数组

要将b的元素设置为与a的元素相同,可以使用以下选项

初始化b有点不同

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

一个接一个地复制图形的元素

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

为什么这个语句int b[5]=a;生成名为无效初始值设定项的错误

你在做两件事:

定义一个包含5个整数的数组b

将数组b初始化为数组a。在C中不能这样做。具体地说,该语句从未像您预期的那样将b[0]初始化为a[0],将b[1]初始化为a[1]等等。为此,您需要memcpy b,a,sizeof b

void*memcpy void*目的地,常量void*来源,大小\u t num

将num bytes的值从源指向的位置直接复制到目标指向的内存块

void functint b[5]

此函数仅将数组作为参数-此处没有数组赋值

实际上,您可以编写它,因为不需要数组大小:

void func(int b[])

参数是如何在不赋值的情况下接收数组的,我在哪里发送数组的基址?这就是将数组传递给函数的方式。将数组名传递给函数时,实际上是在解析数组第一个元素的地址。在数组内部,您可以直接访问/修改该数组的任何元素。@artm:Nitpicking:One从不传递变量的名称。名称是程序员使用的变量的同义词,它们不存在于运行的代码中。在类似您的注释的情况下,当您将数组传递给函数时,应该只使用短语…void funcint b[]实际上与void funcint*b完全相同。
void func(int b[])