首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当打印为函数参数时,为什么地址两个不同的值相同?

这个现象是由于在函数调用过程中,参数传递方式的不同导致的。

在C语言中,函数参数传递有两种方式:值传递和引用传递。

  1. 值传递:当将一个变量作为参数传递给函数时,实际上是将该变量的值复制一份传递给函数。在函数内部,对参数的修改不会影响到原始变量的值。因此,即使传递的是两个不同的变量,它们的值相同,但它们的地址是不同的。
  2. 引用传递:当将一个指针作为参数传递给函数时,实际上是将该指针的地址传递给函数。在函数内部,对参数指针所指向的内存进行修改,会影响到原始变量的值。因此,如果传递的是两个不同的指针,它们指向的内存地址相同,它们的值也会相同。

综上所述,当打印为函数参数时,如果参数是通过值传递方式传递的,即使传递的是两个不同的变量,它们的值相同但地址不同;如果参数是通过引用传递方式传递的,传递的是两个不同的指针,它们的值和地址都相同。

关于云计算领域的相关知识,腾讯云提供了丰富的产品和服务:

  1. 云计算概念:云计算是一种基于互联网的计算方式,通过将计算资源、存储资源和应用程序等提供给用户,实现按需使用、灵活扩展和高可用性的计算服务。
  2. 云计算的优势:灵活性、可扩展性、高可用性、成本效益、安全性等。
  3. 云计算的应用场景:企业应用、大数据分析、人工智能、游戏开发、移动应用、物联网等。
  4. 腾讯云相关产品和介绍链接地址:
    • 云服务器(CVM):提供弹性计算能力,满足不同规模和需求的应用场景。产品介绍链接
    • 云数据库MySQL版:提供高性能、可扩展的关系型数据库服务。产品介绍链接
    • 云原生容器服务:提供高性能、高可靠性的容器化应用部署和管理服务。产品介绍链接
    • 人工智能平台(AI Lab):提供丰富的人工智能算法和模型,支持开发者构建智能应用。产品介绍链接
    • 物联网开发平台(IoT Hub):提供设备接入、数据管理和应用开发的一体化物联网解决方案。产品介绍链接
    • 移动应用开发平台(MPS):提供移动应用开发和运营的一站式解决方案。产品介绍链接
    • 云存储(COS):提供安全、稳定、低成本的对象存储服务。产品介绍链接
    • 区块链服务(BCS):提供安全、高效的区块链应用开发和管理服务。产品介绍链接
    • 腾讯云元宇宙:提供虚拟现实(VR)和增强现实(AR)技术支持的云服务。产品介绍链接
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++ sizeof()运算符参数指针和数组为什么不同

sizeof()参数指针和数组 C++或C语言中,都可以使用sizeof()运算符来计算数组字节大小,除此之外,在C++和C语言中,都可以使用一个指向数组第一个元素内存地址指针来引用数组,因此...,如果要计算数组字节大小,或长度,传递数组本身或传递指向数组指针给sizeof()运算符似乎都是可以,实际上则不然,二者有本质上区别。...和m不同!...这是为什么呢? 不同原因 这主要是因为sizeof()运算符参数是数组本身,将计算是数组大小,而如果传递是指针作为参数,那计算便是指针大小,而不是整个数组。...来源:C++ sizeof()参数指针和数组区别 免责声明:内容仅供参考,不保证正确性。

12521

一个类如何实现两个接口中同名同参数不同返回函数

假设有如下两个接口: public interface IA {     string GetA(string a); } public interface IB {     int GetA(string... a); } 他们都要求实现方法GetA,而且传入参数都是一样String类型,只是返回一个是String一个是Int,现在我们要声明一个类X,这个类要同时实现这两个接口: public class... X:IA,IB 由于接口中要求方法方法名和参数是一样,所以不可能通过重载方式来解决,那么我们该如何同时实现这两个接口拉?...IB.GetA(string a)//实现IB接口     {         Console.WriteLine("IB.GetA");         return 12;     } } 同样如果有更多同名同参不同返回接口...,也可以通过"接口名.函数名"形式实现.

2.9K20

【C语言总集篇】操作符篇——从不会到会过程

'——按位异或操作符 两个二进制位不同时,结果1,否则为0; 从结果中我们可以看到,两个数对应二进制位不相同时,即一个1,另一个0,此时结果1,如果同为1或者同为0,则结果0; 4...,不进入对应语句块中,所以当我们输入非零都只能将逻辑反操作后a打印出来; 输入0,a经过逻辑反操作后变成真,其1,这时就能进入条件语句语句块中打印“hehe”,此时也能进入循环语句语句块中打印...,表达式右操作对象; 下面我们通过代码来测试一下这两个操作符: 可以看到,两个等号,是在判断a与b是否相等,3与2不相等,表达式结果假,0;一个等号是将b2赋值给了a,此时打印是...,这两个成员数据类型分别是char和int两个不同类型;在简单了解了结构体之后,我们继续来解答下一个问题; 4.2 为什么结构体成员操作符有两个?...; "()"——函数调用操作符常用在函数中,在需要进行函数调用时使用,我们要分清函数操作符两个操作对象——函数名和参数; 其中参数这个操作对象可以没有可以是一个或者多个,只要是在操作符内部所有对象都是函数参数

20110

c语言每日一练(4)

而从语句2进入条件可以看出,b3*n+1的话就一定会执行语句2,b大于20就会直接跳出循环,打印目标。...arr这个数组看似有5个元素,实际上只有4个元素,为什么?因为arr数组中有一个逗号表达式,而逗号表达式运算规则是从左往右依次计算,整个表达式最后一个表达式。...只有当实参和与其对应形参同名才共占用存储单元 D. 形参是虚拟,不占用存储单元 解析:在调用函数时候,真实传递给函数是实参,函数定义部分函数名后参数是形参。...形参和实参名字是可以相同,在函数调用时候,形参是实参一份临时拷贝,分别占用不同内存空间,所以A正确,B错误。即使形参和实参名字相同,也是占用不同内存空间,C错误。...^操作符作用可以将两个相同位变为0,不同位变为1,那么两个相同数^就会出现0,而^又是满足交换律 所以我们不需要在意^顺序,偶数次出现数一旦被^就会像对对碰一样变为0。

10110

C语言: 指针进阶

正是因为这个性质,在打印单个字符时候,指针需要解引用,而用 %s 打印整个字符串时候,只需要传首元素地址即可,而指针刚好指向是首元素地址。...曾经一道面试例题:  答案是:......not same        .......same 原因:前面两个字符数组,是把其中字符放入到了str1、str2中,这两个地址不同。...看看以下例题分析:  一维数组: 传入是数组名时候,函数参数无论是数组、指针、还是指针 [ ] 都是可以 传入是指针数组数组名,那么这时候就要用到二级指针了,指向指针地址了。...函数指针 函数指针是用来存放函数地址一种指针。 形式:返回类型+(*数组名)(函数参数类型) void (*pf)(int , int); 为什么要用()让*和函数名优先结合呢?...回调函数 回调函数就是一个通过函数指针调用函数。如果你把函数指针(地址)作为参数传递给另一 个函数这个指针被用来调用其所指向函数,我们就说这是回调函数

59130

iOS底层原理总结 - 探寻block本质(一)

自动变量会捕获到block内部,也就是说block内部会专门新增加一个参数来存储变量。 auto只存在于局部变量中,访问方式传递,通过上述对age参数解释我们也可以确定确实是传递。...重新生成c++代码看一下内部结构中两个参数区别。 ? 局部变量c++代码 从上述源码中可以看出,a,b两个变量都有捕获到block内部。但是a传入,而b传入则是地址。...打印内容 可以发现a变为了不可控一个数字。为什么会发生这种情况呢?...打印内容 上文提到过,如果在block中访问了auto变量,block类型__NSStackBlock__,上面打印内容发现blcok__NSMallocBlock__类型,并且可以正常打印出...打印内容 3. block作为Cocoa API中方法名含有usingBlock方法参数 例如:遍历数组block方法,将block作为参数时候。

1K41

【C++】基础知识讲解(命名空间、缺省参数、重载、输入输出)

命名空间定义 两个同名变量,会优先在找局部,如果找不到,再找全局。如果我们想打印1,就可以加上 ‘::’ 前面不加域情况下,默认是空,也就是全局域,该符号叫域作用限定符。...注意:同一个工程中允许存在多个相同名称命名空间,编译器最后会合成同一个命名空间中。 命名空间使用 当我们想打印,如果没有打开std这个空间域,我们就无法用C++方式打印。...缺省参数 概念 缺省参数是声明或定义函数函数参数指定一个缺省。在调用该函数,如果没有指定实 参则采用该形参缺省,否则使用指定实参。...C语言不允许同名函数 CPP语言允许同名函数,要求:函数相同参数不同(例如:类型、顺序、个数不同),构成函数重载。 下面举例类型不同: C语言不支持重载。...注意:如果两个函数函数名和参数是一样,返回不同是不构成重载,因为调用时编译器没办 法区分。

11110

程序员C语言快速上手——基础篇(五)

需要注意,函数返回和形式参数都是可选有返回,必须配合return语句返回,函数没有返回,应当使用void关键字声明,注意我措辞,是应当,而不是必须!...C89中,省略返回,会默认函数返回int类型。以下代码是可以正常编译运行。...简单解释一下,编译器扫描到未定义函数,编译器会自以为是的给你进行一个隐式声明,但是编译器并不知道函数返回和具体形式参数啊,这时候它就会简单猜测一下,默认你返回是int,然后根据你调用函数参数简单分析一下形参类型...C语言实参与形参之间是传递,简单说就是拷贝。在调用函数传参,实际参数被复制了一份,拷贝给形参。因此形参与实参本质上就是两个变量,不可等同,它们仅是相同。...: 1 count=10 2 t=0 如上示例中,counter函数一个计数函数,每次调用都将传入加10,可是为什么函数外部打印t,它没有发生改变呢?

90020

C++【多态】

首先观察父类函数中是否出现了 virtual 关键字 其次观察是否出现虚函数重写现象,三同:返回函数名、参数(协变例外) 最后再看调用虚函数,是否【父类指针】或【父类引用】 父类指针或引用调用函数...,不同 函数参数 最终修饰结果不同,确保链接不会出错,构成重载 重写(覆盖):发生在类中,出现虚函数且符合重写三同原则,则会发生重写(覆盖)行为,具体表现为 父类虚函数接口 + 子类虚函数体,...,父类指针面临 不同虚表中相同函数重写 ,该如何处理呢?...为什么重写同一个 func1 函数,在两张虚表中地址相同?...不同环境下结果可能不同 内联对编译器只是建议,编译器识别为虚函数,会忽略 inline 5.静态成员函数为什么不能构成多态?

11330

【FreeRTos】队列管理1

写队列任务实现: 这个任务被创建了两个实例,一个不停地往队列中写数值100,而另一个实例不停地往队列中写入数值200。任务入口参数被用来每个实例传递各自写入。...,所以写入队列通过任务入口参数传递 – 这种方式使得每个实例使用不同 。...第二个参数是被发送数据地址,本例中即变量lValueToSend地址。 第三个参数是阻塞超时时间 – 队列满,任务转入阻塞状态以等待队列空间有效。...第二个参数是保存接收到数据缓冲区地址,本例中即变量lReceivedValue地址。此变量类型与 队列数据单元类型相同,所以有足够大小来存储接收到数据。...第三个参数是阻塞超时时间 – 队列空,任务转入阻塞状态以等待队列数据有效。本例中常量 portTICK_RATE_MS用来将100毫秒绝对时间转换为以系统心跳单位时间

75550

计算机小白成长历程——函数(1)

b中未被替换元素之所以未被打印出来,是因为他们前一位元素是字符串结束标志\0,打印函数读取到字符\0就停止了打印。...自定义函数与库函数相同地方就是它们都有函数名、返回类型和函数参数; 它们区别我们可以简单理解就是一个已经被定义好而且被收录在C语言库中,一个是由程序员根据实际情况进行设计且未被收入到C语言库中...: (1)写一个函数可以找出两个整数中最大: //找出两个整数中最大 int MAX(int x, int y)//int——返回类型;MAX——函数名;x,y——函数参数; { if (x...那我们现在再来看一下a/b/x/y四个变量空间地址,我们可以清楚看到,空间地址并不相同,也就是说,它们四个是四个不同变量,那这样就很好理解了: 参数 参数就好比有四个人,张三、李四、王五、赵六,...x和y与a和b地址相同,但是此时里面的不同,那我们接着运行又会出现什么结果呢: 这里我们可以看到,在函数swap2运行完后将内容传送回来时,a和b进行了交换,此时x和a,y和b地址也都相同

17030

【Linux系统编程】通过系统调用获取进程标识符 及 创建子进程(fork)

那我们再看这样代码: 来运行一下 我们看到: 两个进程打印对应x和x地址都是一样,所以我们可以暂且认为父子进程数据也是共享。...那这里如何做到同一个变量地址相同但是不同,我们目前还不能解释,后面再说。...所以,可以理解子进程被创建,起初操作系统只为其分配一个新进程控制块(PCB),用于维护子进程相关信息。 并不会立即复制父进程整个地址空间,包括代码段和数据段。...比如有一个求和函数,那它return时候,这个和肯定已经求出来了,而return是要把这个结果返回给函数调用地方。...虽然我们看到这两个x地址是一样,但是其实它们是两个不同变量,占用不同存储空间。 那为什么地址看到是一样呢?

21110

【C++】C++11线程库 和 C++IO流

第二个参数是可变参数模板,专门用来给调用对象传参用。 thread不允许拷贝和赋值,这两个函数都被delete掉了,但thread允许移动构造和移动赋值。...多个线程操作同一个共享资源,会出现线程不安全而造成数据不一致等问题,在下面的打印结果中,增大操作次数过后(左图)可以明显看到val出现了问题,没有达到30000预期结果,那么在这样情况下为了保证线程安全一般需要加锁...每个线程会先将内存中共享资源拿到,并将这个设置预期原值,然后对其进行修改得到新,然后对比当前内存中共享资源是否与预期原值相同,如果相同,则将新写回内存,如果不相同,则写回操作失败,重新读取内存...通过条件变量来实现两个线程分别打印奇数和偶数是一种非常安全且经典操作,条件不满足,让线程去条件变量内部维护等待队列进行等待,条件满足,唤醒对应条件变量中等待线程,C++11线程库提供了两个...这回可以读取内容成功,因为虚拟地址还是有效,当前进程地址空间没有发生改变,但是在对象析构,还是会出问题,原因很简单,还是因为winfo和rinfo结构体内部stringptr指针相同,此时这两个指针虽然不是随机分配指针

21220

Python函数参数传递机制

我们以Number类型例,定义a=1,a发生变化后,则a内存地址发生了变化,用id()可查看变量内存地址: >>> a = 1 >>> id(a) 1503521232 >>> a = 2...但如果是两个大小相同浮点数,发现它们并不是指向同个内存地址,这点和int类型不同(这与Python内存管理机制有关,Python对int类型和较短字符串进行了缓存,无论声明多少个相同变量,实际上都指向同个内存地址...不可变类型 我们以list例,list内容发生变化时,还是指向同个内存地址,因为list是可变类型,可以在原处修改。...>>> a = [1, 2, 3] >>> id(a) 39059528 a.append(4) >>> id(a) 39059528 存在多个相同list变量,他们分别指向不同内存地址。...函数调用前 x = 10, y = 20 函数中x = 20, y = 10 函数调用后 x = 10, y = 20 可以看到,我们在函数中对两个Number变量进行了交换,但函数运行之后,发现两个变量并未交换

75420

Golang中函数传参存在引用传递吗?

Go中 slice 在传入函数到底是不是引用传递?如果不是,在函数为什么能修改其?...代码执行后,我们看到结果便是:a、b拥有完全不同内存地址, 说明他们虽然相同(b拷贝a,肯定一样),但是分别在内存中不同地方,也因此在函数 vFoo 内部如果改变 b ,a 是不会受到影响...指针传递 形参指向实参地址指针,对形参指向操作,就相当于对实参本身进行操作。 是不是云里雾里?还是通过代码结合来分析所谓指针传递。...图中 &a 表示a地址: 0xc420080008 引用传递 所谓引用传递是指在调用函数将实际参数地址传递到函数中,那么在函数中对参数所进行修改,将影响到实际参数。...但是这里有个奇怪现象,大家看到了 arr 地址与 s[0] 有相同地址,这也就是为什么我们在函数内部能够修改 slice 原因,因为它作为参数传入函数,虽然 slice 本身是拷贝,但是它内部引用了对应数组结构

2.2K20

50道JavaScript详解面试题,你需要了解一下

答案是输出10,因为将对象传递给函数对象相似,仅传递其,而不传递对内存位置实际引用。这就是为什么更改仅影响函数范围内参数原因。 3、控制台输出是什么?...&是按位运算符,当我们比较11和3,它将与1011和0011二进制相同。结果,只有都为1位保持1,返回输出0011,它是3二进制表示形式, 因此3记录在控制台上。 14、Object。...该对象位于原型链顶部,浏览器查找访问属性,它将遍历原型链,直到找到该或直到不再遍历所有原型为止。 15、空合并运算符做什么? 左侧操作数null或未定义,它将返回右侧操作数。...但是,可以在JavaScript中通过在未将所有可能参数都传递给函数返回不同输出来执行重载。 29、return语句在数组forEach循环中做什么?...41、Array sort()方法默认排序是什么? 按字符从最小到最大。 42、什么是比赛条件? 两个线程或异步进程必须完成自身操作以更新某些共享状态,否则将出现错误或不良结果。

3.5K40

【C语言总集篇】函数篇——从不会到会过程

相同点 自定义函数与库函数相同地方就是它们都有函数名、返回类型和函数参数不同点 它们区别我们可以简单理解就是一个已经被定义好而且被收录在C语言库中,一个是由程序员根据实际情况进行设计且未被收入到...形式参数函数调用完成后就自动销毁了,因此形式参数只在函数中有效。 对于参数定义简单理解就是我在调用函数,传给函数参数就叫做实参;在定义函数时候,定义参数就是形参。...也就是说,它们四个是四个不同变量,因此我们不能用x/y来代替a/b。那这样我们就可以像这样来理解实参和形参关系: 实参传给形参,形参其实是实参一份临时拷贝,对形参修改是不会改变实参。...,printf参数是式子a+b,第二次打印中printf参数是局部变量c,第三次打印中printf参数是自定义函数sum,接下来我们看看打印会不会有什么不同: 从打印结果我们可以看到,打印是一样...一个函数作为另一个函数参数,就可以说是另一个函数通过链式访问调用了这个函数

23511

C语言灵魂——指针

, 是两个不同内存空间,所以没被修改。...解释: main()是主调函数,Increment()是被调函数,当我们在主调函数中调用其他函数,这个参数叫做实参,这个被调函数参数叫做形参,实参会被映射到形参,这个函数被调用时候,主函数实参...编译器看到数组作为函数参数时候,他不会拷贝整个数组,而是仅仅创建一个同名指针,我们这里就是创建了一个整型指针,编译器只是拷贝了主调函数数组首元素地址。...不同点: B返回一个指向一个一维数组指针,而*B返回一个指向整型指针,当我们只是打印地址时候,一维数组B[0]和B[0]首元素起始地址是一样,所以打印地址相同,指针类型会在你尝试解引用时或者尝试做指针算术时候起作用...栈,先进后出,先进被压倒栈底, Add函数调用完成,返回一个指向结果指针(地址),然后内存被释放,所指向地址对应就是个垃圾,尽管他指向这个地址,但是他是不能被保证,因为内存被释放了,

87010

【愚公系列】2021年12月 Python教学课程 12-Python函数

比如 print()函数可以将对象打印到屏幕上;还有一些函数能够返回一个以供程序使用,比如 len()将可计算长度对象元素个数返回给程序。 二、为什么要使用函数呢?...但是,在处理不 同数据类型参数,会有不同情况发生。这一切都是因为以下两点。 -Python 函数参数传递是实际对象内存地址。...在函数内部修改之后,变量 a 内存地址: 1401140320 函数内部 a : 2 函数外部 a :1 为什么 a = 2 之后,函数内外 a 内存地址就不一样了呢?...五、 参数类型 绝大多数函数接收一定数量参数,然后根据实际调用时提供参数不同,输出不同结果。...s' % d) print("函数外部 d 地址:%s" % id(d)) 打印结果是: 函数内部 a 地址:39287880 此时 b :['A'] 函数外部 b 地址:39287880

50120

java中参数传递-传递、引用传递

Java 应用程序中变量可以为以下两种类型之一:引用类型或基本类型。当作为参数传递给一个方法,处理这两种类型方式是相同。两种类型都是按传递;没有一种按引用传递。 按传递和按引用传递。...按传递意味着将一个参数传递给一个函数函数接收是原始一个副本。因此,如果函数修改了该参数,仅改变副本,而原始保持不变。...按引用传递意味着将一个参数传递给一个函数函数接收是原始内存地址,而不是副本。因此,如果函数修改了该参数,调用代码中原始也随之改变。...1、对象是按引用传递 2、Java 应用程序有且仅有的一种参数传递机制,即按传递 3、按传递意味着将一个参数传递给一个函数函数接收是原始一个副本 4、按引用传递意味着将一个参数传递给一个函数...这里需要强调是“参数传递机制”,它是与赋值语句传递机制不同

4.6K20
领券