為什麼這麼多人說C裡沒有指標,C 中為什麼沒有必要使用指標

2022-03-03 07:56:18 字數 3787 閱讀 7727

1樓:癯月笑浮生

c#是有指標的,沒有指標是錯誤的說法。 unsafe只不過是一個標記,不能將指標看作不安全的,這是極度錯誤的觀點,程式安全與否與程式設計師的水平有很大關係,指標改用的時候還要用的

2樓:匿名使用者

指標是非強型別化的,當使用一個指標的時候,指向的不是一個特定的型別,而僅僅是一塊記憶體區。對這個指標進行位移操作,然後向此位置寫入,就可能破壞記憶體,因此稱可以直接操作記憶體的**為不安全的(unsafe)。

平時我們使用c#,是在託管平臺上,這個平臺之所以被稱為「託管的」,是因為程式設計人員不再需要為記憶體的分配、管理和**做太多的工作,clr會在內部管理程式的記憶體。

但是在某些特殊的情況下,如與本地**或com+元件互動的時候,可能需要使用指標來傳遞引數,這時可以配置c#專案屬性,使其「允許不安全的**」,並在不安全的**塊前用unsafe修飾。這樣就可以在c#中使用指標。

c#中對指標是如何定義的?為什麼c#不太使用指標?

3樓:匿名使用者

c#是沒有指標的,如果一定要用,可以用c#中的委託(delegate),效果和函式指標相同

學習c#都會驚奇於它的delegate,其實delegate並沒有太多神祕的地方,說的通俗點,delegate是型別化了的函式指標,它主要應用於**。

學習c++的對函式指標都不回陌生,它是一個儲存了函式地址的變數,但除了地址,它沒有包含任何額外的資訊,如引數的個數、引數型別和函式的返回地址等,所以函式指標是非型別安全的。而delegate對**提供了型別的安全性,從而使我們在處理**等問題的時候可以更加優美的物件導向的方式來編寫**,並且在clr的內部對delegate的操作提供了許多支援(如delegate連結串列),簡化了我們常用的操作。

在使用delegate的過程中,首先要定義一個delegate的型別,如:

public delegate void somefunction(object a,int i,...);

note:它是一個類的定義,可以放在任何地方,此型別定義了此delegate所接收的函式的樣式:返回void,引數列表...

然後,為了使用,要定義類somefunction的一個例項:

public somefunction instance;

接著,我們就可以往這個delegate例項中放「符合規範」的函式(可以為例項函式和靜態函式)。

instance +=new somefunction(someobject.somemethod);

其中someobject為某類的一個例項,它的方面somemethod符合此委託的規範要求,否則將編譯報錯。

最後,可以直接呼叫instance例項來實現對someobject的somemethod的**。

instance(...);

##########################

只是從上面的實現中,貌似看不出delegate真正存在的價值,但實際上delegate增加了對鏈的支援,我們可以象下面這樣應用:

instance +=new somefunction(someobject.somemethod);

instance +=new somefunction(anotherobject.anothermethod);

...然後呼叫instance(...),可以同時激發所有註冊自裡面的**函式。

這是怎樣實現的,首先要研究delegate內在的結構,在每個delegate裡面包括了三個欄位:

target ——》指向**函式所屬的物件例項(對於例項方法來言)

method ——》指向**函式

prev ——》指向另外一個delegate 例項

通過prev就可以比較方便的實現delegate對鏈的支援。

clr定義了delegate.combine和delegate.remove靜態方法實現對連結串列的操作。

4樓:匿名使用者

資料型別 * 指標名;c#中沒有指標……

5樓:匿名使用者

c#中指標的定義和使用與c++基本相同,不太使用指標可能時因為不安全或者有替代辦法。

下面答案寫了很多的那位說c#沒有指標是完全錯誤的,c#指標屬於不安全**,要在unsafe**塊中使用,vs預設關閉了它,需要手動設定。

6樓:癯月笑浮生

c#.的指標是非常常用的,特別是與native dll進行通訊,以及進行流資訊處理,指標都是不可或缺的,要改變指標困難,不敢用的觀點,適當的用指標來優化程式,提高執行效率

7樓:匿名使用者

用指標還要c#幹啥?

c#中為什麼沒有必要使用指標

8樓:

c#中會自動管理記憶體,不需要程式設計師手動分配和釋放,這樣可以有效避免記憶體洩露

9樓:匿名使用者

因為有更方便、現成的東西了,例如泛型、委託,用起來遠比函式指標方便,對於變數來說不是也有個取地址的關鍵字ref麼。

實際上,你在使用這些功能的時候,已經用使用指標了,只是我們看不到framwork類庫中微軟已經整合好的**而已。

10樓:

so this nay

c#裡有沒有指標,或者可以代替指標的語句

11樓:孫中呂

任何程式都有指標.

c#裡的指標由c語言的指標本質一樣,只是描述改變了。

講個類的指標.

public class userdata{}userdata user; //這裡的user就是指標,是指向userdata.

var s="字串變數"; //s也是指標。

同理int,long,double,struct等等,都一樣

12樓:匿名使用者

如果是函式的話 在形參列表裡 給引數的型別前面加上 ref使用的時候也要在引數前加ref

如果要使用顯式的指標 也就是*

就在需要使用指標的類 結構前加unsafe然後就可以像c++一樣用指標了

記著在專案屬性裡允許不安全**

13樓:

有指標的,和c一樣,只是書籍一般不提及。

c#裡面指標為什麼會被列為不安全**?。。

14樓:匿名使用者

c#裡面的指標是安全的c和c++裡面的指標會導致不安全**(跟系統環境或者程式設計師自身的能力有關係)

15樓:匿名使用者

指標是直接搞記憶體。搞不好系統就崩了。所以不安全。

指標真的很方便。可以方便的處理一些麻煩的問題。微軟哥不是不提倡的。

只是他怕別人用不好指標就怪微軟垃圾。所以就稱指標不安全。如果有絕對的把握就用吧。

c#中沒有指標,但可以改變值,為什麼

16樓:大娘很

首先 c# 是有指標的;

msdn:為了保持型別安全,預設情況下,c# 不支援指標演算法。不過,通過使用 unsafe 關鍵字,可以定義可使用指標的不安全上下文。

指標 是 用來指向物件的記憶體地址;相當於 c# 的 引用型別;

雖然地址不變,但裡面的值是可以改變的;

你可以瞭解下:c# 值型別與引用型別;

就可以明白這個問題;c# 中類是 引用型別 類裡面的值型別成員也屬於引用型別 儲存在記憶體堆上,

17樓:

用ref和out關鍵字,可以做到類似指標的功能啊

為什麼這麼多人喜歡木心,為什麼這麼多人喜歡木心?有哪些讓人記憶深刻的詞句

木星內部的世界,木心人 為什麼這麼多人喜歡木心?有哪些讓人記憶深刻的詞句 從前慢記得早先少年時 大家誠誠懇懇 說一句 是一句 清早上火車站 長街黑暗無行人 賣豆漿的小店冒著熱氣 從前的日色變得慢 車,馬,郵件都慢 一生只夠愛一個人 從前的鎖也好看 鑰匙精美有樣子 你鎖了 人家就懂了 大概大家都喜歡他...

c語言為什麼會有指標?c語言為什麼要有指標呢?

指標是c中的精髓,如果沒有,應該說就是一種很平庸的語言,從本質上說,指標體現了von neumann體系結構計算機也就是當今計算機的特徵,記憶體資料按照當前的解釋決定其意義,其指標的運算更是以機器實現的方式展現出來。具體的主要原因大致如下 1 函式的引數傳遞 c語言只有傳值這樣一種方式,在函式體內不...

為什麼這麼多人欺負神起?

最反感發生點什麼事情,就把事情上升到國家高度,再加上有些記者人云亦云,在沒有任何有力證據的情況下,寫些模稜兩可的報道。現在事情鬧到眾人皆知,可是有什麼事實依據嗎?沒有。還有一件事,就是一個女生辱罵 因為她是一名仙后,造成現在全國人民群攻仙后,理由就是她是一名仙后。可是,大家有沒有想過,她憑什麼代表廣...