Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将函数中声明的本地数组传递给另一个数组_C_Arrays - Fatal编程技术网

C 将函数中声明的本地数组传递给另一个数组

C 将函数中声明的本地数组传递给另一个数组,c,arrays,C,Arrays,我的标题清楚地表达了我的问题。让我借此机会: 请看下面的代码: #include <stdio.h> int myf2(int *ser){ *ser=4; printf("\nsecond=%d",*ser); return 0; } int myf1(){ int fil[2]; fil[0]=1; printf("\nfirst=%d",*fil); myf2(fil); printf("\nthird=%d


我的标题清楚地表达了我的问题。让我借此机会:
请看下面的代码:

#include <stdio.h>
int myf2(int *ser){
    *ser=4;
    printf("\nsecond=%d",*ser);
    return 0;   
}
int myf1(){
    int fil[2];
    fil[0]=1;
    printf("\nfirst=%d",*fil);
    myf2(fil);
    printf("\nthird=%d",*fil);
    return 0;
}
int main(){
    myf1();
}

当输出为:

first=1
second=4
third=4
那么,如何将fil数组传递给myf2函数,以便第三个printf打印1而不是4

你能解释一下为什么我的代码错了吗!?我在本地声明这个数组。但正如你所看到的,事实上这不是本地的:)


向函数传递数组时,实际上是在传递指向列表中第一个元素的指针


在函数中,
ser
指向列表中的索引0。因此,
*ser
ser[0]
相同。同样,在定义了
fil
的地方,
*fil
等同于
fil[0]
代码中没有错误。本地数组将一直保留,直到
myf1
的作用域存在为止。它只是将数组的基元素的地址传递给函数,从而对原始数组进行更改

所以要解决你的问题-

  • int-myf2(int*ser)
    声明您作为
    int-myf2(int-ser)

  • 在函数do
    ser=4

  • 在函数
    myf1
    中调用
    myf2
    如下-
    myf2(*fil)

  • 因此,
    fil
    的值不会改变,因为创建了
    *fil
    的副本并将其修改为
    4
    ,从而保持了
    *fil
    的原始值不变


    工作代码-

    当然可以按值传递数组。不幸的是,这在当前的“C”语言中是不可能的(因为糟糕的设计决策)。这就是为什么您应该使用结构黑客,使您的数组而不是数据成员,因为结构可以直接复制。因此,您的示例如下所示:

    #include <stdio.h>
    
    typedef struct {
         int d[2];
    } array_of_2;
    
    int myf2(array_of_2 ser){
        *ser.d=4;
        printf("\nsecond=%d",*ser.d);
        return 0;   
    }
    int myf1(){
        array_of_2 fil;
        fil.d[0]=1;
        printf("\nfirst=%d",*fil.d);
        myf2(fil);
        printf("\nthird=%d",*fil.d);
        return 0;
    }
    int main(){
        myf1();
    }
    
    #包括
    类型定义结构{
    int d[2];
    }_2的数组_;
    int myf2(数组中的数组){
    *序列d=4;
    printf(“\n秒=%d”,*ser.d);
    返回0;
    }
    int myf1(){
    _2 fil的数组_;
    fil.d[0]=1;
    printf(“\n开始=%d”,*fil.d);
    myf2(fil);
    printf(“\n第三个=%d”,*fil.d);
    返回0;
    }
    int main(){
    myf1();
    }
    
    不幸的是,您必须使用点和“d”来引用数组,因为类型“array\u of_2”实际上是一个结构

    在您的例子中,实际上是向数组的第一个元素传递一个指针。因此,“myf2”local(也是一个函数参数)“ser”将只接收“myf1”范围内的本地地址,然后对其进行编辑

    一些插图:

    局部变量和所有其他类型的变量(如全局变量)仅在其生命周期中是特殊的。否则,您可以从哪个函数编辑它们没有限制


    变量在第一次满足其声明时为保留内存,在其作用域结束时为释放内存(在函数返回时为局部变量的情况下)。同时,这个内存可以由其他函数自由编辑。

    一个变量实际上是两个东西,一个标识符,你给它起的名字和一个对象,你给它起的名字

    作用域的概念仅适用于标识符:它是代码的一部分,在该部分中,可以使用您给定的名称访问对象。作用域是编译时特性

    对象没有作用域,它们有生存期。在这里使用的局部变量的情况下,生命周期从执行进入声明变量的范围时开始,到永远离开变量时结束。在调用
    myf2
    期间,您的对象仍然存在,因此可以毫无问题地访问


    此访问是通过在调用中传递给函数的指针完成的。由于指针指向原始对象,因此您在此处所做的所有更改都是对原始对象的更改,并且在您从调用返回时仍然可见。

    Yes。你能解释一下为什么在这种模式下,值不变吗。但在我的代码中它会改变@当我们传递数组的值而不是地址时,解决方案值中的AlirezaHosseini不会改变。这样就创建了它的副本,并对其进行了更改,以保持原始值不变。谢谢。因此,在我尝试的代码中,我传递了索引的确切地址。所以更改应用于数组索引的内存位置。。这是真的吗@AlirezaHosseini是的,在您的方法中,地址处的值被修改,因此原始数组的值被修改。这是如何修改的,
    ser
    被更改,
    ser
    指向
    fil
    的地址,然后
    fil
    被更改。所以我们可以说“这样的数组范围不重要。因为我们正在更改确切的内存值。”?谢谢,但我想你没有正确理解我的问题!我想用数组来做这个。也不是结构。你是说这是不可能的!?:是的,它是-‘C’语言,不允许您按值传递数组。这是一个糟糕的设计决策,之所以这样做,是因为在当时,它的成本很高,通常的做法是传递数组指针而不是数组的数据。这就是创建数组到指针隐式转换的原因。除此之外,这种结构并不美观,它完全符合您的要求。这就是为什么您经常需要编写“for”循环来复制数组。或者你可以应用结构黑客。你应该知道数组有自己的类型,与指针不同。有关更多信息,请在internet上搜索。谢谢@dbush。但正如你所看到的。这个数组是本地的。所以它不应该改变。正如我们在局部变量中看到的,它们在父函数中不会改变(通过其他函数的修改)。谢谢@詹斯。但我没有跟上。你能更清楚地解释物体的部分吗!?请看下面的代码:这里,我只写了一个变量而不是数组。并成功应用了该范围。为什么@AlirezaHosseini,我认为你必须学习指针的概念。一个指针“指向”一个对象,这就是你最初的目标
    #include <stdio.h>
    
    typedef struct {
         int d[2];
    } array_of_2;
    
    int myf2(array_of_2 ser){
        *ser.d=4;
        printf("\nsecond=%d",*ser.d);
        return 0;   
    }
    int myf1(){
        array_of_2 fil;
        fil.d[0]=1;
        printf("\nfirst=%d",*fil.d);
        myf2(fil);
        printf("\nthird=%d",*fil.d);
        return 0;
    }
    int main(){
        myf1();
    }