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)
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();
}