加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

为什么C函数会自动改变数组?

发布时间:2020-12-16 10:05:24 所属栏目:百科 来源:网络整理
导读:我正在学习C,我只是好奇为什么C函数,当给出像int,char,double等参数时,在调用时不改变那些参数的值,但是当它们传递数组参数时,它们改变数组元素. 例如: void conversion(int array[]){ array[0] = 0;}void numeric(int m){ m = 0;} 当你声明并初始化int arr
我正在学习C,我只是好奇为什么C函数,当给出像int,char,double等参数时,在调用时不改变那些参数的值,但是当它们传递数组参数时,它们改变数组元素.

例如:

void conversion(int array[])
{
    array[0] = 0;
}

void numeric(int m)
{
    m = 0;
}

当你声明并初始化int array [1] = {1}和int m = 1时,使用这些参数调用函数,数组[0]会被更改,但是int m却没有.是否有更改数组参数的原因,但int参数保持不变?它与指针有关吗?

解决方法

而不是这个功能

void numeric(int m)
{
    m = 0;
}

请考虑以下代码段

void numeric(int *m_ptr)
{
    *m_ptr = 0;
}

//...

int m = 1;

numeric( &m );

如您所见,变量m将在函数中更改.

现在让我们使用与数组相同的函数

int m[1] = 1;

numeric( &m[0] );

在这种情况下,对象m [0]将在函数中更改.

现在这个功能

void numeric(int *m_ptr)
{
    *m_ptr = 0;
}

可以改写像

void numeric(int m_ptr[])
{
    *m_ptr = 0;
}

因为声明为具有数组类型的参数被调整为指针.例如这些函数声明

void numeric(int m_ptr[1]);
void numeric(int m_ptr[10]);
void numeric(int m_ptr[100]);
void numeric(int m_ptr[]);

相互等价,相当于函数声明

void numeric(int *m_ptr);

并声明相同的一个功能.您可以在一个编译单元中包含所有这些声明.

另一方面,传递给函数的数组被隐式转换为指向其第一个元素的指针.所以上面函数的调用

numeric( &m[0] );

相当于电话

numeric( m );

因此,数组用作参数,并相应地作为参数,其元素可以更改,因为元素通过引用传递给函数.如果您将通过引用传递单个对象,如上面第一个代码段示例中所示,那么它也将被更改.

因此,函数是通过引用还是通过值接受参数之间存在差异.在使用数组的情况下,它们的元素实际上通过引用传递给函数,因此可以在函数中进行更改.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读