2012-05-07 171 views
3

是否有任何情況或具體的例子,我們需要指針的工作? 即可以不使用它們而需要指針的東西? 我們可以將指針作爲函數參數發送,但可以通過返回的數據完成。我們可以使用指針來更改函數中的多個變量,但也有一個解決方法。我們需要指針嗎?

我們確實需要指針嗎?

我知道這是一個愚蠢的問題,對不起,但在這種情況下似乎對我來說是正確的 我只是想知道是否有什麼我們不能使用指針做。

+0

不,我們不。如果我們這樣做了,今天使用的任何編程語言如何工作? (當然,除了**一個**語言)。 –

+0

這不是一個合適的問題,使用http://programmers.stackexchange.com/ – rooftop

+9

我認爲這是一個完全有效的問題。 – Puppy

回答

4

指針可避免在高級語言的範式設計 - 舉個例子爪哇 - 但他們往往在語言宣稱提供的功能實際實際實現再次出現。

除非你正在使用某種形式的動態地重新配置FPGA架構,狀態機或類似的想法,你的電腦的殖民地,實際運算機器是不是很面向對象。我們不在存儲設備中執行操作,而是取數據,對其進行計算並將其寫回。爲了在內存中查找數據,我們使用地址的概念(有些東西稱爲內容尋址內存,但對於大多數用途而言,它們不是優選的)。一旦你決定你的數據(或函數體,或包含兩者的結構體)在某個地址的內存中,你必須弄清楚你將如何處理這個地址。您可以將地址寫入另一個存儲器位置,我們擁有最熟悉的指針概念。您可以將地址存儲在堆棧中,但這只是與名爲「堆棧指針」的寄存器相關的存儲空間。或者您可以將地址存儲在寄存器或指令字中。在特殊的片上存儲器

但是,如果你看一個指令字的實際形式,爲不平凡的處理器「註冊」實際上是編號的位置稱爲寄存器文件。 RISC對它們編號的傳統使得這個特別明顯,但即使在命名寄存器的彙編語言方案中也是如此 - MOV或任何其他指令都會有幾位決定指令的類型和格式,以及一些編碼寄存器的位每個操作數的編號。因此,寄存器間接尋址在技術上是保存另一個地址的一個存儲單元,也就是指針。類似地,直接編碼在指令字中的數據項的地址也是一個存儲器位置(包含指令字的程序存儲器)的實例,涉及實際保存數據的另一位置。

結論:你可以隱藏高水平程序員三分球,但只要你的實現是基於

(尋址數據存儲器/寄存器文件)< - > CPU - < - >(可尋址程序存儲器)

計算的想法,你不能避免他們在執行層面。

1

難道我們需要高級語言指針?在嚴格的圖靈機器意義上,沒有。但是,實際上,我們不在Turing機器中編寫代碼 - 我們使用高級語言進行編碼,開發人員需要某些構造來緩解編寫代碼的心理負擔。指針使得某些抽象(例如鏈表)更容易表達。因此,在對「需要」一詞進行最嚴格的解釋時,答案可能不是,實際上,答案是肯定的,我們確實需要它們。

請閱讀StackOverflow的常見問題。

+1

高級語言傾向於避免指針。低級別的人也會這樣做。 – Pubby

+0

不,低級語言不會避免指針,儘管它們可能會避免調用它們。 –

+0

@Pubby猜測取決於你對「高級語言」的定義。我將C和C++(和Pascal就這個問題)稱爲「高級」 - 我想你不會。 –

1

我認爲非常有用的指針可以作爲(高效)迭代器通過數組。

例如(C99):

ptrdiff_t stride = 8; 
double* data = ...; 
size_t size = ...; 
const double* end = data + size * stride; 

for (double* restrict p = data; p < end; p += stride) 
    *p = ...; 

你可以看到指針運算是非常有用的表達意圖。能夠傳遞指針+大步表示子數組也是有用的。

有些語言禁止使用指針來操作數據(但允許引用),雖然這些語言我從來沒有舒服的他們讓你寫一個作用於陣列功能的方式。在C中,你寫例如。

void foo(const double* data, ptrdiff_t stride, size_t size, double* out); 

在C#你會寫

void Foo(double[] data, int stride, double[] output); 

但現在output被強制爲一個完全成熟的陣列,而不是別的一個子陣列,或者在一個元件輸出的情況下一個普通的堆棧變量(如果你真的想C#提供指針,但讓我們假裝它不)。

0

指針的功能是引用的超集。你可以使用指針做的所有事情都可以做。指針是比引用更強大的工具,這就是C使用指針的原因。這是一種低級強大的語言。

有任何情況或具體的例子,我們需要指針作業

是,例如用於指針算術。

//copy string to a buffer 
char buffer[1024]; 
strcpy(buffer, "hello "); 
strcpy(buffer + 6, "world!"); 

可能的東西,需要的指針可以在不使用它們來完成。

當然,你想傳遞一個大對象的方法。您可以將指針傳遞給它,而不是複製它,但傳遞引用可能會更好。

void foo(Object const& o); // <- this one is prefered 
void foo(Object *o); 

這是一組規則如何將對象傳遞給function

我們可以發送指針作爲函數參數,但是可以用返回的數據發送 ?

可以這樣做。返回指針的問題是「指針指向的存儲位置是什麼?」。 It's a dangerous idea to return local variable。 (C++ 11解決了這個問題,move semantics

我們可以使用指針的函數改變不止一個變量,但有也太

對不起一個解決辦法,但我不明白這個。

我們究竟需要指針嗎?

是的,我們做。

0

在許多情況下,尤其是當您考慮內存消耗和程序的時間時(例如,將大型數組傳遞給不修改它的子程序),您需要使用指針,單向方法可能是優選的。但是,將數組傳遞給該函數需要將整個數組移動到子程序的本地存儲區域。這在時間和空間上都是昂貴的。由於這個龐大的數組通常是通過引用傳遞的。

相關問題