[英]How does exactly this code work in 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
的第二次調用中,獲取變量 value 的地址,並使用該地址創建一個指針 x 並在函數結束后立即刪除,對嗎? 就堆棧內存消耗而言,這些調用中哪個更便宜? 還是兩者是一回事?
它們幾乎相同。 唯一的區別是您在main
的調用堆棧上有一個指針對象p
,但是如果您要擔心這一點,那么您就會遇到問題。 :)
他們倆很相似。 第一個看起來更昂貴,因為您創建了兩次指針,一次作為局部變量(在main
內部),一次作為函數參數(傳遞給foo
),但是編譯器的“優化”階段可能會將第一個變成第二個(假設你對p
做的唯一一件事就是傳遞它,你以后不要在main
重用它)。
在第一次調用中,您傳遞了一個包含value
地址的value
。
在第二個中,您直接傳遞value
的地址。
請注意,賦值運算符表示p
和&value
是相同的,因此您應該能夠將任何一個傳遞給函數,正如您所證明的那樣。
指針具有可以像其他任何東西一樣復制的值。 它們具有值語義。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.