JAVA C# C/C++之比较学:参数传递

一文看尽C、C++、C#的联系与区别(改变世界的第一步) 阅读详情

首先,感谢http://www.cnblogs.com/jacktag/p/3173415.html我们的定义为值传递是传递栈中的值;引用传递是传递栈地址。

注意,引用传递不是传递堆中的地址,而是传递堆栈中的地址。

1、java

在互联网上,大部分认为java是按值传递的。这样的说法不能说是错误的。但是更深层次的理解是,对于java而言,堆栈上只能分配基本类型的存储和对对象的引用。而所有对象的创建均存在与堆上,堆栈中保存对该对象的引用。在函数传值时,对于基本类型,肯定是通过压栈数据值得方式进行传递,对于引用,同样是通过压栈引用的方式进行传递。


2、c#

c#中有ref关键字,但是似乎更令大家困惑了,抄一段上面链接的代码

class Program
    {
        static void Main(string[] args)
        {
            Student xiaohong = new Student("小红", 12);
            BanZheng(ref xiaohong);
            //BanJiaZheng(xiaohong);		//这种情况下第一种输出为红姐 18 第二种输出为小红   12
            Console.WriteLine(xiaohong.Name + "  " + xiaohong.Age);
            Console.ReadKey();
        }

        static void BanZheng(ref Student student)
        {
            //student.Name = "红姐";
            //student.Age = 18;

            student = new Student("红姐", 18);       
        }

        static void BanJiaZheng(Student student)
        {
            //student.Name = "红姐";
            //student.Age = 18;     //如果将这两句话注释掉,输出为红姐 18//

            student = new Student("红姐", 18);           
        }
    }

    class Student
    {
        public Student(string name, int age)
        {
            Name = name;
            Age = age;
        }
        public string Name { get; set; }
        public int Age { get; set; }
    }

如此可以看出,c#和java类似,传递对象时,如果不使用ref关键字,则是进行值传递,传递对堆中对象的引用。而如果加上ref,则相当与传递的是对引用的引用,也就是堆栈中对象的引用的堆栈地址。换句话说,加上ref和不加ref都可以对对象进行修改,但是如果不加ref,则没有办法将该引用指向新的地址,因为引用是值传递。

另外,你不能用ref或者out关键字声明变量。ref在使用时必须提前对变量赋值,而out在使用前不需要提前对变量赋值,如果有赋值,会自动清空。


3、C/C++

JAVA和纯C#(除非使用不安全代码)中都没有指针的概念。但是C/C++有。

相对于c#和java,在c++中,对象时存储在堆中还是存储在栈中,是由开发者决定的。显然,堆和栈有容量,性能,生存周期上的差异。

Object obj(int initParam);

 

上面语句表示根据其所在的上下文自动声明对象。

如果上面的话在函数中出现,就表示在堆栈上分配对象。





C#调用C++类对象:从P/Invoke到托管封装的完整实践 在混合编程中,平台调用(P/Invoke)是连接不同语言模块的核心技术,它允许托管代码(如C#)调用非托管动态库(如C++ DLL)中的函数。其原理是通过定义明确的调用约定和数据类型封送(Marshaling),在运行时跨越托管与非托管边界进行数据转换和函数调度。这项技术的价值在于能够复用高性能的原生代码库,同时利用高级语言的开发效率。在工业控制、图像处理和高频交易等对性能有严苛要求的应用场景中,这种混合架构尤为关键。通过设计C语言风格的封装接口(C Wrapper)并妥善管理对象生命周期,可以安全高效地将 阅读详情

相关推荐

【SystemVerilog项目实践】4.AHB-SRAMC(验证计划)

验证计划

托马斯的博客 3660

java/c/c++/c#参数传递问题

1、参数传递 众所周知

D来之 995

Mac用户必看:PD虚拟机网络初始化失败的3分钟修复指南(附详细截图)

本文针对Mac用户在Parallels Desktop(PD虚拟机)启动时遇到的“网络初始化失败”问题,提供了快速诊断与修复指南。核心原因是macOS系统更新后权限未正确授予。文章通过详细的三步修复法(关闭进程、修改配置文件、重新授权重启),帮助用户在3分钟内恢复虚拟机网络连接,并附有排查清单与预防建议。

weixin_29231027的博客 538

C#与C++的区别

引子: 刚开始学习C#,以前用的是C++。学习C#的原因是要做界面但是MFC实在太难了,QT的编译环境又不喜欢,然后同学就推荐了C#。 学了C++以后再用C#会发现C#很简单,不停的拖控件再双击添加code就行了,后来我考虑添加一个头文件放一些公有的类和函数,然后发现C#不能写头文件,也没有include。然后我觉得要去学一下C#和C++的不同之处 C#和C++的区别: (来自网上搜到的资...

great_name的博客 1万+

从X86到ARM:将VINS-Fusion-GPU和ego-planner迁移到Jetson Orin-NX时,我踩过的那些‘环境差异’坑

本文详细介绍了将VINS-Fusion-GPU和ego-planner从X86平台迁移到Jetson Orin-NX(ARM架构)时遇到的环境差异问题及解决方案。内容涵盖ARM与X86的架构差异、依赖管理、性能调优和硬件接口适配,特别强调了CUDA在ARM平台上的优化配置和内存访问技巧,帮助开发者高效完成跨平台迁移。

weixin_42647395的博客 119

告别130MB/s瓶颈!用Zynq+NVMe实现1.2GB/s高速存储的PL数据分流实战

本文详细介绍了如何通过Zynq+NVMe实现1.2GB/s高速存储的PL数据分流方案,突破传统Zynq架构130MB/s的瓶颈。文章分享了PL直连NVMe的硬件架构设计、软件栈优化及性能调优实战技巧,帮助开发者实现高速数据流的稳定存储。

weixin_42653691的博客 372

各种编程语言中的参数传递方式简介

各种编程语言中的参数传递方式简介 C/C++、 Java、 python、c# 、JavaScript参数传递方式简介 ☆C/C++里传递函数参数的时候,传值还是传引用是函数声明的时候决定的。下面几种函数声明方法都很常见: // 传值 void PassByValue(int a) void PassByPtr(int* a) // 传引用 void PassByRef(int& a) 这里我们把C++中形参传指针也归类为传值,因为这里形参copy的是一个指针的副本,本质上还是传值,只不过和调用方的

cnds123的专栏 1864

【STM32项目】基于AI技术的多功能消防机器人(完整工程资料源码)

机器人通过巡逻扫描环境空间与障碍物、定位导航、探测物体/环境进行建模/自动地图测绘、扫描火焰、获取温湿度大小、获取空气安全情况来判断当前环境地点是否安全,检测到温度过高或检测到易燃、烟雾、有毒气体或摄像头识别到火焰时能够通过高压水泵喷射器来实现火焰隔离工作,蜂鸣器进行现场鸣笛报警,同时将当前环境温湿度大小、空气情况、环境地图、是否安全信息,将各个传感器来接收获取到的信息,实时发送到用户手机中的微信小程序,实现与用户远程监视功能,用户同时也能通过手机与电脑远程下发命令来操控机器人来实现交互功能

嵌入式技术开发 1万+

C# 、C++ 、Java 三者的比较

<br />C#是三大主流OOP(面向对象编程)语言(C++, Java, C#)之一,也是最新的一种,其中必然借鉴了前两者的长处,“否则它的缔造者就该打屁股”——候捷语,见《C# Primer 中文版》的译续:-) 它们三者有太多的共性,其语法和编程概念,绝大部分彼此兼容,精一而通三。尤其对熟练掌握C++的程序员而言,学习Java和C#没有任何难度,唯一需要花些时间的地方就是熟悉这二者的类库。<br />三者中,C++是我最熟悉也最喜欢的,在学习C#时难免会将其与C++做对比,现将C#与C++的区别做一番

461

AgentScope 实战训练营-7 种多智能体协作模式详解

本教程基于阿里巴巴开源的AgentScope Java框架,系统讲解多智能体系统的开发方法。涵盖7种核心协作模式:Pipeline流水线、Routing路由、Handoffs智能体交接、Supervisor监督器、Subagent子智能体、Skills技能系统及Workflow工作流。详细阐述ReActAgent、AgentScopeAgent、StateGraph等核心概念,提供完整的配置示例与代码实现,帮助开发者快速掌握基于Spring AI Alibaba的多智能体应用开发。

program哲学 163

Unity-TextMeshPro如何扩展材质实现字体Face+Outline流光效果

前言 TexeMeshPro 是Unity的一个Text文本插件,实现了比UGUI的Text,更好看的效果,跟高效的性能,所以深受大家的喜欢,但是再好的插件,也不是万能的,比如我们的策划有个新需求,要我们的VIP的名字比普通玩家有更好看的效果,例如:字体流光,外发光颜色扰动,字体贴图等等。那我们就需要去扩展TextMeshPRo的shader功能了。如下图所示 本文,我就带大家一起来扩展一下:如何扩展TextMeshProUGUI TextMesh原始面板 扩展功能后的面板 扩展TextMeshPro

TxNet 9675

C#与C/C++交互(1)——需要了解的基础知识

C#中用于实现调用C/C++的方案是P/Invoke(Platform Invoke),让托管代码可以调用库中的函数。类似的功能,JAVA中叫JNI,Python中叫Ctypes。调用过程为查找dll,例子中为Test.dll'将该dll加载到内存中查找函数在内存中的地址,例子为查找Load函数,并将其参数按照函数的调用约定压栈,例子中调用约定为Cdecl将控制权转移给非托管函数。

enternalstar的博客 2127

【SA8155P】AIS Camera相关内容的简单介绍

【SA8155P】AIS Camera相关内容的简单介绍

静谧、淡雅 1700

指针与数组的异同及其所揭示的c/c++语言与c#/Java数据存储的异同

指针与数组的异同及其所揭示的c/c++语言与c#/Java数据存储的异同

yiying0729的博客 1042

Statistics and Machine Learning Toolbox

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

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C++动态库之间的参数传递

C++动态库参数传递应该遵循的规范。 1、接口头文件应该声明extern "C"; 2、接口参数中不要有string这种C++风格的参数

sinat_26682915的博客 1183

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

python java c c#_C#学习笔记(与Java、C、C++和Python对比)

最近准备学习一下Unity3D,在C#和JavaScript中选择了C#。因此,做为学习Unity3D的准备工做,首先须要学习一下C#。用了一两天的时间学了一下C#,感受是处在C++和Java之间的一门语言。比Java更灵活,比C++更简单,确实是一门设计很优秀的语言。html基础概念和语法基本数据类型C#中的基本数据类型分为值类型和引用类型。相比Java而言,增长了无符号数,多了C中的struc...

weixin_31232021的博客 274

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C#与C++的区别(笔记整合归纳)

1、编译区别 C#代码首先会被编译为CLR(公共语言运行库),然后由.NET框架解析。(与Java类似) C ++代码将会直接被编译为机器代码。 2、内存管理的不同 C#是在虚拟机上执行,会自动进行内存管理。而,C ++需要手动组织管理内存。 C#中实现自动垃圾回收,通过new在堆中创建对象,当对该对象的引用计数为0时回收内存。类有构造函数而没有析够函数。 3、指针使用的区别 C#不支持使用指针,但可以使用一些不安全的类和方法;而,C ++允许使用指针。 C++中的指针在带来强大的灵活性和高

redlotu233的博客 2万+

c++ c# java语法比较

c++ c# java 控制台字符打印 cout << "Hello World"" endl; Console. readLine("Hello World") System.out.println("Hello World"")

shuangshuangboole的博客 189

学习Java之前先学C语言

学习Java前先学C语言主要有三大优势:首先,Java继承了C语言80%的基础语法(如数据类型、流程控制等),可降低学习门槛;其次,C语言的面向过程特性与Java的面向对象形成对比,有助于理解编程范式演进;最关键的是,C语言的指针概念是理解Java引用的基础,能帮助掌握内存机制。这种学习路径不仅能夯实编程基础,还能培养系统的计算机思维,为后续学习其他高级语言铺路。建议初学者采用C→Java的渐进式学习策略。

ywl470812087的博客 1207

C#中方法中的参数传递

C#中方法中的参数传递 C#语言的参数传递跟C++、JAVA有什么区别呢? 实际上区别不大,C#中跟JAVA一样没有了C语言的指针参数传递,减少了复杂性,那C#中有哪几种实参参数呢?下面罗列: 1.值参数,不含任何修饰符 2.引用参数,以ref修饰符声明。这就跟其他语言有点不同,也只是修饰符这一块 3.输出参数,据我了解,java跟C++是没有所谓的输出参数的,以out修饰符声明。 4

巫山老妖 1915

unity 中 c# 与 object-c 交互

C/C++可以直接与object-c交互,只需把文件后缀写成.mm就行了。c#又可以和C/C++交互,所以嘛。。。c#也就可以和object-c交互了。 1、在unity中 c#调用object-c 函数 首先,定义一个新建一个.mm文件,然后在里面定义一个C风格接口的函数,如 extern "C" { void testFunc(char* arg) { // 这里可以调用

u012085988的专栏 1万+

请描述java python 和c#函数的使用差异_C#学习笔记(与Java、C、C++和Python对比)

最近准备学习一下Unity3D,在C#和JavaScript中选择了C#。所以,作为学习Unity3D的准备工作,首先需要学习一下C#。用了一两天的时间学了一下C#,感觉是处在C++和Java之间的一门语言。比Java更灵活,比C++更简单,确实是一门设计很优秀的语言。基础概念和语法基本数据类型C#中的基本数据类型分为值类型和引用类型。相比Java而言,增加了无符号数,多了C中的struct,字符...

weixin_39611037的博客 156

C、C++、C#、python、java编程—函数

public class TestMax { /** 主方法 */ public static void main(String[] args) { int i = 5; int j = 2; int k = max(i, j); System.out.println( i + " 和 " + j + " 比较,最大值是:" + k); } /** 返回两个整数变量较大的值 */ public static int max(.

seek97的博客 544

C++,C#,Java中的Lambda

1)捕获列表使用 Lambda 表达式来创建匿名函数。使用 lambda声明运算符=> 从其主体中分离 lambda 参数列表。若要创建 Lambda 表达式,需要在 Lambda 运算符左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块。任何 Lambda 表达式都可以转换为委托类型。Lambda 表达式可以转换的委托类型由其参数和返回值的类型定义。如果 lambda 表达式不返回值,则可以将其转换为Action委托类型之一;否则,可将其转换为Func委托类型之一。

Iamme 1534
上一篇: C++中的虚函数及其实现方式
下一篇: JAVA C# C/C++之比较学:初始化顺序
define_us
博客等级 码龄14年 157粉丝 531原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值