2012-11-19 49 views
2

例如這樣的代碼:如何精確地用C此代碼的工作++

#include <iostream> 
using namespace std; 

void foo(int* x){ cout << "X = " << *x << endl;} 

int main() 
{ 
    int value = 5; 
    int *p = &value; 
    foo(p); 
    foo(&value); 
    return 0; 
} 

在功能foo指針p的副本(x)的實際函數內創建的第一個呼叫,並且一旦被刪除的功能結束,對吧?在foo的第二次調用中,獲取變量值的地址並用該地址創建一個指針x,並在函數結束後立即刪除,對嗎?在堆棧內存消耗方面,這些調用中的哪一個更便宜?或者都是一樣的東西?

+0

他們最終在語義方面做同樣的事情。我只是堅持第二。但是,如果你真的使用C++,那麼引用可能更適合。 – chris

+0

請不要將有關指針的C++帖子標記爲「C」參考「 –

+0

哈哈,我沒想到回覆如此之快。謝謝你的回答,那麼,你的意思是第二個更好呢?如果是那麼爲什麼?在此先感謝,併爲Taggin C sry,Im新 – user1836252

回答

1

它們都是相似的。第一種看起來比較貴,因爲你要創建一個指針兩次,一次作爲局部變量(在main之內),並且再次作爲函數參數(傳遞到foo),但編譯器的「優化」階段可能會首先將第二個(假設你使用p所做的唯一一件事是通過它,並且稍後在main中不再使用它)。

+0

謝謝!非常豐富:) – user1836252

+0

@ user1836252因此,一本書可能會建議您編寫代碼以儘可能爲人類可讀,並讓編譯器優化運行時。 「人類可讀」是主觀的:你給出的例子非常簡單,以至於額外的變量並沒有幫助,但是代碼如'current_balance = previous_balance + interest_paid; display(current_balance);'可能比'display(previous_balance + interest_paid)'更具可讀性;'因爲像'current_balance'這樣的命名(臨時)變量有助於向讀者解釋你的意圖。 – ChrisW

1

它們幾乎完全相同。唯一的區別是你在main的調用堆棧上有一個指針對象p,但如果你擔心這個問題,那麼你就有問題了。 :)

0

在第一次調用,你傳遞一個包含地址value的變量。

第二,您直接通過地址value

請注意,賦值運算符說p&value都是相同的,所以您應該可以將任一個傳遞給您已經證明的函數。

0

指針的值可以像其他任何東西一樣複製。他們 具有價值語義。

void foo(int* t); 

通過值獲取指針。它將創建一個指針 參數的副本並在其內部使用它。

int value = 23; 
int *p = &value; // &value takes the address of value and use it to copy initialize p 
foo(p); // copy the value of the pointer inside foo 
foo(&value); // do the same but don't create a temporary