数组作为函数入参传递,在函数内修改数据,原数据是否会被修改?

Mybatis调用PostgreSQL存储过程实现数组入参传递 关于mybatis调用postgres存储过程传递数组参数的解决方案~ 阅读详情

是的,在C语言中,当数组名作为参数传入函数后,在函数内修改数组元素会直接修改原数组数据。这是因为C语言中数组名作为函数参数传递时,实际上传递的是数组首元素的地址(指针),而不是数组的副本。这种机制的本质是指针传递,具体如下:

1. 数组名的本质是指针

  • 数组名在大多数情况下会退化为指向数组首元素的指针。例如:
int arr[5] = {1, 2, 3, 4, 5};

此时 arr 等价于 &arr[0](即首元素 1 的地址)。

  • 当数组名作为参数传入函数时,函数接收的是该地址值(数组名也表示数组的首地址),而不是整个数组的拷贝
void modify(int arr[], int size) {
    arr[0] = 100; // 修改首元素
}

此处 arr 实际是 int* 类型(指针),而非整个数组。

2. 函数内通过指针直接操作原始内存

函数内部通过接收到的指针(即数组首地址)访问数组元素时,实际是在直接读写原始数组的内存。例如:

void modify(int *ptr, int size) {
    for (int i = 0; i < size; i++) {
        *(ptr + i) *= 2; // 通过指针算术运算修改元素
    }
}

此操作直接修改了原数组的内容,而非操作副本。

3. 与普通变量的值传递对比

  • 普通变量(如 int):传递的是值的副本,函数内修改不影响原始变量:
void change(int x) { x = 10; } // 不影响外部变量
  • 数组:传递的是地址,函数内通过地址修改的是同一块内存:
void changeArray(int arr[]) { arr[0] = 10; } // 直接影响原数组

这种差异源于 C 语言的设计选择:为避免复制大型数组的开销,采用指针传递。

4. 多维数组的传递机制

  • 二维数组作为参数时,同样传递首地址:
void modifyMatrix(int matrix[][4], int rows) {
    matrix[0][0] = 100; // 直接修改原始数据
}

需指定除第一维外的其他维度大小(如 [][4]),以便编译器计算地址偏移。

5,核心原因

函数通过接收到的指针直接读写原始数组的内存地址,而非操作副本。这种“按地址传递”(Pass by Address)机制是 C 语言高效处理数组的核心设计,但也要求开发者谨慎管理内存与边界。

#include <stdio.h>

void modify(int arr[])
{
    arr[0] = 100; // 直接修改原数组的首元素
}

void modify_array(int * ptr, int size)
{
    for (int i = 0; i < size; i++)
    {
        *(ptr + i) *= 2;
    }
}

void print_array(int *ptr, int size)
{
    for (int i = 0; i < size; i++)
    {
        printf("%d -> %d\n", i, *(ptr + i));
    }
}

int main()
{
    int a[3] = {1, 2, 3};
    modify(a);
    printf("%d\n", a[0]); // 输出 100(而非 1)

    modify_array(a, 3);
    print_array(a, 3);
    return 0;
}
100
0 -> 200
1 -> 4
2 -> 6
重新梳理c++函数传递,传递数组给函数。 为什么对这部分进行梳理,因为这部分是我经常出错的部分,感觉长时间不用,就会忘记,学的就是一个shit,所以本着好记性不如烂笔头,相信总有一天,会将其印在骨头里面。 c++函数传递主要参考 参考:https://blog.youkuaiyun.com/nawuyao/article/details/50283611 参考: https://blog.youkuaiyun.com/richerg85/article/details/14450183 C++ 传递数组给函数主要参考 参考:https://www.runoob.com/c 阅读详情

相关推荐

量化策略分享 | MA超进化:LLT低延迟趋势线

移动平均线(MA)是我们技术分析中常用的一种趋势跟踪指标,但在使用的时候你是否也会有这样的烦恼:交易信号延迟太久,或者交易信号太频繁了!延迟性和平滑性问题似乎是不可兼得的“鱼和熊掌”。 针对这个问题,广发证券基于通信领域的滤波器原理,在《短线择时策略研究之三:低延迟趋势线与交易性择时》中创造性构建了:LLT低延迟趋势线(Low-lag Trendline)。 LLT低延迟趋势线是一种二阶滤波器,阶数相对适宜,相比MA、EMA等均线指标能够降低延迟,同时增强在低频部分的输出信号。 当然,..

量化交易研究 5310

【C语言】将数组A中的内容和数组B中的内容进行交换(数组一样大)

解题思路: 1、定义两个大小相同的数组; 2、利用循环依次交换数组中的每个元素。 具体代码: #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; int main(){ int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int arr2[10] = { 11, 12, 13, 14, 15,...

renxin 772

记录思科cisco交换机升级iso步骤

Cisco Nexus 93180交换机版本升级

a635161812的博客 4378

C语言函数可以修改数组的值吗

代码给你答案 #include <stdio.h> void fun(int *a,int n) { int i,t; for(i=0;i<2/n;i++){ t=a[i]; a[i]=a[n-1-i]; a[n-1-i]=t; } } int main(int argc,char *argv[]) { int k[10]={1,2,3,4,5,6,7,8,9,10},i; fun(k,5);

公众号:风景邮递Yuan的博客 6097

从RadixTree到哈希表:深入对比SGLang和vLLM的Prefix Cache实现差异

本文深入对比了SGLang与vLLM在大语言模型推理服务中实现Prefix Cache(前缀缓存)的两种核心方案。SGLang采用基于Radix Tree的RadixAttention,支持任意长度前缀的精确匹配与灵活复用;vLLM则采用基于哈希表的方案,深度集成于PagedAttention,实现简洁但要求块级精确对齐。文章剖析了二者在设计哲学、内存管理、适用场景及集群级优化(如Prefix Cache Aware Routing)上的关键差异,为高性能LLM服务的技术选型提供决策依据。

blockchain9miner的博客 956

用Python玩转Milvus:从安装SDK到完成第一个向量搜索Demo

本文为Python开发者提供了一份详细的Milvus向量数据库实战指南。文章重点讲解了如何规避版本兼容性陷阱,正确部署Milvus服务端并安装匹配的Python SDK。通过一个电影推荐系统的完整案例,演示了从数据建模、集合创建、向量插入、索引构建到执行混合搜索的全流程,帮助开发者快速上手并完成第一个向量搜索Demo。

weixin_29239279的博客 192

C语言中指针数组作为参数传递修改内容

#include void change(char **strs){ strs[0] = "paaa"; strs[1] = "pbbb"; strs[2] = "cpcc"; strs[3] = "ddxd"; } int main() { char *strs[4]; int i; strs[0] = "aaa"; strs[1] = "bbb"; strs[2] =

m0_37663482的博客 1万+

萤石云cs刷机解绑固件

萤石CS-C2C-32WFR刷机包,萤石CS-C6TC刷机包,萤石CS-C6H刷机包,萤石猫眼产品等等。萤石云摄像头固件修改,绑定手机号解绑,更换序列号教程。

海康威视技术支持 2万+

数组作为函数的入参

数组作为函数的形参的时候,表示的只是头指针。不能再用sizeof来计算数组的大小。 如果直接sizeof(array),那就不对了。我们可以把len传进来。 LinkNode * initLink(LinkNode *dummy,int array[],int len) { if(dummy == NULL || sizeof(array) == 0) return NULL;

Thinking 4033

使用pytorch-superpoint与pytorch-superglue项目实现训练自己的数据集

superpoint与superglue的组合可以实现基于深度学习的图像配准,官方发布的superpoint与superglue模型均基于coco数据训练,与业务中的实际数据或许存在差距,为此实现基于开源的pytorch-superpoint与pytorch-superglue项目实现训练自己的数据集。然而,在训练pytorch-superpoint有诸多细节需要优化,特此整理成技术文档。本文档描述了实验pytorch-superpoint与pytorch-superglue项目训练自己的图像配准模型。

a486259的博客 9506

Qt基础之十九:进程与QProcess

进程就是一个程序的执行实例,也就是正在运行的程序。对操作系统来说,进程就是一个担当分配系统资源CPU时间、内存的实体。在Qt 中,我们使用QProcess来表示一个进程。这个类可以允许我们的应用程序启动一个新的外部程序,并且与这个程序进行通讯。当外部程序开始启动时,QProcess的状态为Starting;外部程序已经启动时,QProcess的状态为Running,并发送started()信号;当外部层序退出了,QProcess的状态为NotRunning(初始状态),并发送finished()信号。

草上爬的博客 1万+

【C语言】数组传参

数组传参时不论字符串、字符、整形都可以使用数组和指针接收,并且利用相关知识调用 字符串数组可以不传递数组长度,其它类型的数组需要传递数组长度 我们都在for循环,区别在于你是什么情况下break的。......

m0_52094687的博客 2万+

基于Python的专利数据爬虫开发指南:从入门到实战

本文将详细介绍如何使用Python开发一个高效的专利数据爬虫系统,涵盖最新技术栈如Playwright、异步IO、反反爬策略等。文章包含完整代码实现、性能优化技巧及法律合规建议,帮助读者构建可投入生产的专利数据采集解决方案。专利数据是技术创新的重要指标,包含技术细节、申请人信息、法律状态等宝贵信息。企业竞争情报分析技术趋势预测研发方向决策知识产权战略制定。

2201_76125261的博客 1588

C++技能系列 ( 5 ) - 详解函数入参/返回参使用(值传递/引用传递/指针传递/智能指针传递)

值传递:形参开辟内存空间,与形参不同的地址,不能改变值。(变量名的访问)> 指针传递:形参不开辟内存空间,与形参相同的地址,能改变值。(地址的访问)> 引用传递:形参开辟内存空间,与形参相同的地址,能改变值。

weixin_30197685的博客 2455

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

向函数传递数组

传地址形式传数组(一维数组与高维数组传递方式) 传值形式传数组

乘风破浪会有时 2万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

指针在函数传递数组时的运用

如果希望在函数内部操作数组,必须传递数组指针 此代码表示了数组在函数间传递的方法,通过在子函数内修改数组数值,更明显表示了传入的是数组地址 #include <stdio.h> int max(int *intArr, int l)//intArr接受一个传入的地址,等价于int *a = &b; { //*intArr接收到数组地址后,intArr即为数组第一个元素所在地址...

qq_43433860的博客 8235

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

forEach如何修改原数组和sort排序经典场景

forEach() 介绍 forEach()方法需要一个回调函数(这种函数,是由我们创建但是不由我们调用的)作为参数 回调函数中传递三个参数: 第一个参数,就是当前正在遍历的元素 第二个参数,就是当前正在遍历的元素的索引 第三个参数,就是正在遍历的数组 代码举例: let myArr = ['王一', '王二', '王三']; myArr.forEach((item, index, arr) => { console.log('item:' + item); console.

老司机的后备箱 1690

【c语言】函数的数据传递原理 | 数组传入函数方法

函数的数据传递原理数组传入函数方法 当实参a传入add函数中,并不是a真正传入函数中,而是以复制的方式传给了add中的a 当传入地址时,复制的就是地址,传入数据时,复制的就是参数值 数组传入函数: 一个传入数组求和的函数如下 : 如果想将整个数组传入函数中,就需要给定数组的长度len:

努力让自己的能力配得上梦想. 5840

forEach会不会修改原数组

forEach 的介绍: forEach()方法需要一个回调函数(这种函数,是由我们创建但是不由我们调用的)作为参数 回调函数中传递三个参数: 第一个参数,就是当前正在遍历的元素 第二个参数,就是当前正在遍历的元素的索引 第三个参数,就是正在遍历的数组 注意:forEach() 没有返回值。也可以理解成:forEach() 的返回值是 undefined。 即 let tempArry = myArr.forEach() 这种方式接收是没有意义的。 forEach 能不能改变原数组 ...

Teemo_shape的博客 5037

C 语言函数参数传递:值传递、指针传递、数组传递的底层原理差异

传递方式拷贝内容内存操作能否修改原变量适用场景值传递变量的值(副本)值被压入栈,函数操作副本否小型数据(如整数、浮点数),避免副作用指针传递变量的地址值(指针副本)地址被压入栈,函数通过指针间接访问原内存是大型数据或需修改原变量时(如结构体)数组传递数组首地址值(指针副本)地址被压入栈,函数通过指针算术访问原数组是数组操作,效率高(避免数组拷贝)核心差异点内存拷贝:值传递拷贝整个值;指针和数组传递只拷贝地址值(固定大小,如 4/8 字节),数据本身不拷贝。修改能力。

2501_93892011的博客 489

【C语言指南】数组作为函数参数的传递机制

理解数组作为函数参数的传递机制,对于编写高效、可靠的C语言代码具有关键意义。它不仅影响着函数对数据的操作方式,还与内存管理、程序性能等方面紧密相关。本文将深入探讨C语言数组作为函数参数时的传递细节、特点以及相关注意事项。

2301_76297596的博客 1604

C语言中数组名作为参数进行函数传递

C语言中数组名作为参数进行函数传递在普通变量或下标变量作函数参数时,形参变量和实参变量是由编译系统分配的两个不同的内存单元。在函数调用时发生的值传送是把实参变量的值赋予形参变量。在用数组名作函数参数时,不是进行值的传送,即不是把实参数组的每一个元素的值都赋予形参数组的各个元素。因为实际上形参数组并不存在,编译系统不为形参数组分配内存。那么,数据的传送是如何实现的呢?在我们曾介绍过,数组名就是数组的首

二次元代码屋 1万+

Go 数组作为函数参数的传递方式剖析

在 Go 语言编程中,函数是构建程序逻辑的重要模块,而数据在函数间的传递方式则深刻影响着程序的行为与性能。数组作为一种基础数据结构,其作为函数参数的传递方式具有独特之处。理解 Go 数组在函数间传递的机制,对于开发者编写高效、健壮的代码至关重要。

DJV29807654的博客 630

【转】C语言有参函数调用时参数间数据传递问题

谈C语言有参函数调用时参数值传递问题 C语言有参函数调用时参数间数据传递问题 C语言中在发生有参函数调用时,实参变量与形参变量之间的数据都是单向的“值传递”方式。包括指针变量和数组名作参数的情况。 C...

qq_41684134的博客 786

js参数传递数组对象,修改此参数,会影响原数组吗

1,方法中改变了原数据的,会影响原数组,包括单个的赋值,排序 var a = [1,2,3]; function test(arr){ arr[0] = 4;//直接改变原数组的第一个数据,影响原数组,故改变了原数组。 console.log(arr);//[4,2,3]; } a;//在没有调用test之前是[1,2,3] test(a);//输出[4,2,3] a;//te...

2012 3496

怎样把数组作为参数传递给函数

在把数组作为参数传递给函数时,有值传递(by value)和地址传递(by reference)两种方式。在值传递方式中,在说明和定义函数时,要在数组参数的尾部加上一对方括号([]),调用函数时只需将数组的地址(即数组名)传递给函数。例如,在下例中数组x[]是通过值传递方式传递给byval_func()函数的: # include voidbyval_func(int[]);    

CAO527121128的专栏 7818
上一篇: C语言,函数返回数组指针有几种方式?
下一篇: 如何防止函数内意外修改数组数据?
AI发烧友
博客等级 码龄4年 266粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值