C語(yǔ)言中out和ref的區(qū)別是什么?

C語(yǔ)言中out和ref的區(qū)別是什么?

ref:相當(dāng)于c語(yǔ)言的引用參數(shù) 實(shí)參和形參一起變。
out:多用于輸出參數(shù) 就是在return之前必須給out標(biāo)示的參數(shù)賦值。

C語(yǔ)言的基本特性:
1、C是高級(jí)語(yǔ)言:它把高級(jí)語(yǔ)言的基本結(jié)構(gòu)和語(yǔ)句與低級(jí)語(yǔ)言的實(shí)用性結(jié)合起來(lái)。

C 語(yǔ)言可以像匯編語(yǔ)言一樣對(duì)位、字節(jié)和地址進(jìn)行操作,而這三者是計(jì)算機(jī)最基本的工作單元。
2、C是結(jié)構(gòu)式語(yǔ)言:結(jié)構(gòu)式語(yǔ)言的顯著特點(diǎn)是代碼及數(shù)據(jù)的分隔化,即程序的各個(gè)部分除了必要的信息交流外彼此獨(dú)立。這種結(jié)構(gòu)化方式可使程序?qū)哟吻逦?,便于編碼、維護(hù)以及調(diào)試。C 語(yǔ)言是以函數(shù)形式提供給用戶的,這些函數(shù)可方便的調(diào)用,并具有多種循環(huán)、條件語(yǔ)句控制程序流向,從而使程序完全結(jié)構(gòu)化。

3、C語(yǔ)言功能齊全:具有各種各樣的數(shù)據(jù)類型,并引入了指針概念,可使程序效率更高。而且計(jì)算功能、邏輯判斷功能也比較強(qiáng)大,可以實(shí)現(xiàn)決策目的的游戲。
4、C語(yǔ)言適用范圍大:適合于多種操作系統(tǒng),如Windows、linux、DOS、UNIX等等;也適用于多種機(jī)型。

C語(yǔ)言對(duì)編寫需要硬件進(jìn)行操作的場(chǎng)合,優(yōu)于其它高級(jí)語(yǔ)言,有一些大型應(yīng)用軟件也是用C語(yǔ)言編寫的。
5、C語(yǔ)言應(yīng)用指針:可以直接進(jìn)行靠近硬件的操作,但是C的指針操作不做保護(hù),也給它帶來(lái)了很多不安全的因素。C++在這方面做了改進(jìn),在保留了指針操作的同時(shí)又增強(qiáng)了安全性,受到了一些用戶的支持,但是,由于這些改進(jìn)增加語(yǔ)言的復(fù)雜度,也為另一部分所詬病。

Java則吸取了C++的教訓(xùn),取消了指針操作,也取消了C++改進(jìn)中一些備受爭(zhēng)議的地方,在安全性和適合性方面均取得良好的效果,但其本身解釋在虛擬機(jī)中運(yùn)行,運(yùn)行效率低于C++/C。一般而言,C,C++,java被視為同一系的語(yǔ)言,它們長(zhǎng)期占據(jù)著程序使用榜的前三名。
6、C語(yǔ)言文件由數(shù)據(jù)序列組成:可以構(gòu)成二進(jìn)制文件或文本文件常用的C語(yǔ)言IDE(集成開發(fā)環(huán)境)有Microsoft Visual C++,Dev-C++,Code::Blocks,Borland C++,Watcom C++,Borland C++ Builder,GNU DJGPP C++,Lccwin32 C Compiler 3.1,High C,Turbo C,C-Free,win-tc,xcode(mac os x)等。

新特性
1、對(duì)齊處理(Alignment)的標(biāo)準(zhǔn)化(包括_Alignas標(biāo)志符,alignof運(yùn)算符,aligned_alloc函數(shù)以及<stdalign.h>頭文件。
2、_Noreturn 函數(shù)標(biāo)記,類似于 gcc 的 __attribute__((noreturn))。
3、_Generic 關(guān)鍵字。 
4、多線程(Multithreading)支持,包括:_Thread_local存儲(chǔ)類型標(biāo)識(shí)符,<threads.h>;頭文件,里面包含了線程的創(chuàng)建和管理函數(shù)。

 
5、增強(qiáng)的Unicode的支持,基于C Unicode技術(shù)報(bào)告ISO/IEC TR 19769:2004,增強(qiáng)了對(duì)Unicode的支持。包括為UTF-16/UTF-32編碼增加了char16_t和char32_t數(shù)據(jù)類型,提供了包含unicode字符串轉(zhuǎn)換函數(shù)的頭文件<uchar.h>. 
6、刪除了 gets() 函數(shù),使用一個(gè)新的更安全的函數(shù)gets_s()替代?!?br/> 7、增加了邊界檢查函數(shù)接口,定義了新的安全的函數(shù),例如 fopen_s(),strcat_s() 等等?!?br/> 8、增加了更多浮點(diǎn)處理宏。

 
9、匿名結(jié)構(gòu)體/聯(lián)合體支持,這個(gè)在gcc早已存在,C11將其引入標(biāo)準(zhǔn)?!?br/> 10、靜態(tài)斷言(Static assertions),_Static_assert(),在解釋 #if 和 #error 之后被處理?!?br/> 11、新的 fopen() 模式,(“…x”),類似 POSIX 中的 O_CREAT|O_EXCL,在文件鎖中比較常用。
12、新增 quick_exit() 函數(shù)作為第三種終止程序的方式。

當(dāng) exit()失敗時(shí)可以做最少的清理工作。
13、_Atomic類型修飾符和<stdatomic.h>頭文件。

C#中關(guān)鍵字ref和out的區(qū)別

1.?ref?關(guān)鍵字使參數(shù)按引用傳遞。其效果是,當(dāng)控制權(quán)傳遞回調(diào)用方法時(shí),在方法中對(duì)參數(shù)所做的任何更改都將反映在該變量中。

若要使用?ref?參數(shù),則方法定義和調(diào)用方法都必須顯式使用?ref?關(guān)鍵字。

2.?out?關(guān)鍵字會(huì)導(dǎo)致參數(shù)通過(guò)引用來(lái)傳遞。這與?ref?關(guān)鍵字類似,不同之處在于?ref?要求變量必須在傳遞之前進(jìn)行初始化。若要使用?out?參數(shù),方法定義和調(diào)用方法都必須顯式使用?out?關(guān)鍵字。
不同:使用ref時(shí),變量必須在傳遞之前進(jìn)行初始化,不一定必須在函數(shù)內(nèi)部初始化。

out必須在函數(shù)內(nèi)部初始化。

ref與out區(qū)別是什么?

ref

C#中out和ref之間的區(qū)別

ref和out都是C#中的關(guān)鍵字,所實(shí)現(xiàn)的功能也差不多,都是指定一個(gè)參數(shù)按照引用傳遞。對(duì)于編譯后的程序而言,它們之間沒(méi)有任何區(qū)別,也就是說(shuō)它們只有語(yǔ)法區(qū)別。

總結(jié)起來(lái),他們有如下語(yǔ)法區(qū)別: 1、ref傳進(jìn)去的參數(shù)必須在調(diào)用前初始化,out不必,即:int i;SomeMethod( ref i );//語(yǔ)法錯(cuò)誤SomeMethod( out i );//通過(guò) 2、ref傳進(jìn)去的參數(shù)在函數(shù)內(nèi)部可以直接使用,而out不可:public void SomeMethod(ref int i){ int j=i;//通過(guò) //…}public void SomeMethod(out int i){ int j=i;//語(yǔ)法錯(cuò)誤}3、ref傳進(jìn)去的參數(shù)在函數(shù)內(nèi)部可以不被修改,但out必須在離開函數(shù)體前進(jìn)行賦值。

ref在參數(shù)傳遞之前必須初始化;而out則在傳遞前不必初始化,且在 … 值類型與引用類型之間的轉(zhuǎn)換過(guò)程稱為裝箱與拆箱??偨Y(jié):應(yīng)該說(shuō),系統(tǒng)對(duì)ref的限制是更少一些的。out雖然不要求在調(diào)用前一定要初始化,但是其值在函數(shù)內(nèi)部是不可見(jiàn)的,也就是不能使用通過(guò)out傳進(jìn)來(lái)的值,并且一定要在函數(shù)內(nèi)賦一個(gè)值?;蛘哒f(shuō)函數(shù)承擔(dān)初始化這個(gè)變量的責(zé)任。

下面談?wù)剅ef和out到底有什么區(qū)別:1 關(guān)于重載 原則:有out|ref關(guān)鍵字的方法可以與無(wú)out和ref關(guān)鍵字的方法構(gòu)成重載;但如想在out和ref間重載,編譯器將提示:不能定義僅在ref和out的上的方法重載2 關(guān)于調(diào)用前初始值 原則:ref作為參數(shù)的函數(shù)在調(diào)用前,實(shí)參必須賦初始值。否則編譯器將提示:使用了未賦值的局部變量; out作為參數(shù)的函數(shù)在調(diào)用前,實(shí)參可以不賦初始值。3 關(guān)于在函數(shù)內(nèi),引入的參數(shù)初始值問(wèn)題 原則:在被調(diào)用函數(shù)內(nèi),out引入的參數(shù)在返回前至少賦值一次,否則編譯器將提示:使用了未賦值的out參數(shù); 在被調(diào)用函數(shù)內(nèi),ref引入的參數(shù)在返回前不必為其賦初值。

總結(jié):C#中的ref和out提供了值類型按引用進(jìn)行傳遞的解決方案,當(dāng)然引用類型也可以用ref和out修飾,但這樣已經(jīng)失去了意義。因?yàn)橐脭?shù)據(jù)類型本來(lái)就是傳遞的引用本身而非值的拷貝。ref和out關(guān)鍵字將告訴編譯器,現(xiàn)在傳遞的是參數(shù)的地址而不是參數(shù)本身,這和引用類型默認(rèn)的傳遞方式是一樣的。

同時(shí),編譯器不允許out和ref之間構(gòu)成重載,又充分說(shuō)明out和ref的區(qū)別僅是編譯器角度的,他們生成的IL代碼是一樣的。有人或許疑問(wèn),和我剛開始學(xué)習(xí)的時(shí)候一樣的疑惑:值類型在托管堆中不會(huì)分配內(nèi)存,為什么可以按地址進(jìn)行傳遞呢?值類型雖然活**程的堆棧中,它本身代表的就是數(shù)據(jù)本身(而區(qū)別于引用數(shù)據(jù)類型本身不代表數(shù)據(jù)而是指向一個(gè)內(nèi)存引用),但是值類型也有它自己的地址,即指針,現(xiàn)在用ref和out修飾后,傳遞的就是這個(gè)指針,所以可以實(shí)現(xiàn)修改后a,b的值真正的交換。這就是ref和out給我們帶來(lái)的好處。

首先:兩者都是按地址傳遞的,使用后都將改變?cè)瓉?lái)參數(shù)的數(shù)值。其次:rel可以把參數(shù)的數(shù)值傳遞進(jìn)函數(shù),但是out是要把參數(shù)清空,就是說(shuō)你無(wú)法把一個(gè)數(shù)值從out傳遞進(jìn)去的,out進(jìn)去后,參數(shù)的數(shù)值為空,所以你必須初始化一次。這個(gè)就是兩個(gè)的區(qū)別,或者說(shuō)就像有的百科網(wǎng)友說(shuō)的,rel是有進(jìn)有出,out是只出不進(jìn)。ref(C# 參考)ref 關(guān)鍵字使參數(shù)按引用傳遞。

其效果是,當(dāng)控制權(quán)傳遞回調(diào)用方法時(shí),在方法中對(duì)參數(shù)的任何更改都將反映在該變量中。若要使用 ref 參數(shù),則方法定義和調(diào)用方法都必須顯式使用 ref 關(guān)鍵字。例如:class RefExample{ static void Method(ref int i) { i = 44; } static void Main() { int val = 0; Method(ref val); // val is now 44 }}傳遞到 ref 參數(shù)的參數(shù)必須**初始化。這與 out 不同,后者的參數(shù)在傳遞之前不需要顯式初始化。

盡管 ref 和 out 在運(yùn)行時(shí)的處理方式不同,但在編譯時(shí)的處理方式相同。因此,如果一個(gè)方法采用 ref 參數(shù),而另一個(gè)方法采用 out 參數(shù),則無(wú)法重載這兩個(gè)方法。例如,從編譯的角度來(lái)看,以下代碼中的兩個(gè)方法是完全相同的,因此將不會(huì)編譯以下代碼:class CS0663_Example{ // Compiler error CS0663: \”cannot define overloaded // methods that differ only on ref and out\”. public void SampleMethod(ref int i) { } public void SampleMethod(out int i) { }}但是,如果一個(gè)方法采用 ref 或 out 參數(shù),而另一個(gè)方法不采用這兩個(gè)參數(shù),則可以進(jìn)行重載,如下例所示:class RefOutOverloadExample{ public void SampleMethod(int i) { } public void SampleMethod(ref int i) { }} out(C# 參考)out 關(guān)鍵字會(huì)導(dǎo)致參數(shù)通過(guò)引用來(lái)傳遞。這與 ref 關(guān)鍵字類似,不同之處在于 ref 要求變量必須在傳遞之前進(jìn)行初始化。

若要使用 out 參數(shù),方法定義和調(diào)用方法都必須顯式使用 out 關(guān)鍵字。例如:class OutExample{ static void Method(out int i) { i = 44; } static void Main() { int value; Method(out value); // value is now 44 }}盡管作為 out 參數(shù)傳遞的變量不必在傳遞之前進(jìn)行初始化,但需要調(diào)用方法以便在方法返回之前賦值。 ref 和 out 關(guān)鍵字在運(yùn)行時(shí)的處理方式不同,但在編譯時(shí)的處理方式相同。

因此,如果一個(gè)方法采用 ref 參數(shù),而另一個(gè)方法采用 out 參數(shù),則無(wú)法重載這兩個(gè)方法。

c# ref和out區(qū)別僅僅是參數(shù)需不需要初始化?

ref和out使用時(shí)的區(qū)別是:①:ref指定的參數(shù)在函數(shù)調(diào)用時(shí)候必須初始化,不能為空的引用。而out指定的參數(shù)在函數(shù)調(diào)用時(shí)候可以不初始化;②:out指定的參數(shù)在進(jìn)入函數(shù)時(shí)會(huì)清空自己,必須在函數(shù)內(nèi)部賦初值。

而ref指定的參數(shù)不需要。

一:ref 關(guān)鍵字使參數(shù)按引用傳遞。其效果是,當(dāng)控制權(quán)傳遞回調(diào)用方法時(shí),在方法中對(duì)參數(shù)所做的任何更改都將反映在該變量中。若要使用 ref 參數(shù),則方法定義和調(diào)用方法都必須顯式使用 ref 關(guān)鍵字。也即是說(shuō),在方法中對(duì)參數(shù)的設(shè)置和改變將會(huì)直接影響函數(shù)調(diào)用之處(代碼①及②)。

無(wú)論是函數(shù)的定義還是調(diào)用時(shí)均不可忽略關(guān)鍵字ref.二:ref定義的參數(shù)在使用前必須初始化,無(wú)論在函數(shù)定義時(shí)候參數(shù)有沒(méi)有賦予初值。這條正好區(qū)分out指定的參數(shù)可以不在調(diào)用函數(shù)的時(shí)候進(jìn)行初始化。三 :對(duì)out來(lái)說(shuō),**條同樣適用。

將代碼①以及②中的ref全部修改成out,則可與使用ref得到同樣的結(jié)果。 四:out指定的參數(shù)必須在函數(shù)定義的時(shí)候就賦初值。否則則出現(xiàn)錯(cuò)誤。

對(duì)比ref指定的參數(shù)則可以不在函數(shù)內(nèi)部進(jìn)行賦初值,在函數(shù)調(diào)用時(shí)候再賦初值也可以。