2010-07-16 70 views
0

我使用C++和我有指針 我知道了一些麻煩,如果我們聲明一些變量問題關於第二個三分球

int t=7; 
int *p=&t; 

* P給變量t這裏也定義的,但在C++中ADRESS ** ?爲什麼使用它我讀它,但我有一些誤解,請任何人可以給我例子,如何使用讓約需給出的例子

回答

1

首先* p會給你變量t的值而不是t的地址。只有'p'會給你t的地址。

本質上每個地址只是一個整數。如果您正在編譯32位體系結構,那麼它將是32位長數字,如果您正在編譯64位,那麼它將是64位長。這意味着你可以使用一個簡單的整型變量來存儲任何變量的地址,而不管變量是什麼類型,但最好使用適當類型的指針來存儲變量的地址。這樣我們可以對指針進行解引用,並且我們不必在任何時候使用正在指向的變量來進行類型轉換。

要創建一個指向某個變量的指針,我們聲明一個相同類型的變量,但在變量的名稱前面加上一個'*'。例如,您可以聲明一個整數如下

int a;

要創建指向'a'的指針,請創建一個與a類型相同的新變量,並在其前面放一個'*'。因此,指向上述變量'a'的聲明將看起來像

int * p;

請注意,除了附加的'*',它的聲明是相同的。現在'p'是指向整數變量的指針。

現在考慮你想要另一個指針指向這個變量'p'。再次聲明一個類似'p'的變量,並在其前面放一個'*'。因此,對上述變量的指針聲明將看起來像

int ** pp;

再次注意,除了一個額外的'*'這個聲明與'p'聲明非常相似。所以變量「PP」是指針一個指向整數

您可以以同樣的方式聲明指針到「PP」和循環將持續下去。對於非簡單類型也是如此,即指向類或結構類型變量的指針是以相同方式創建的。

+0

我認爲'* p'不一定是變量't'的*值*,而是變量*'t'本身:) – fredoverflow 2010-07-16 11:06:55

2

例如,你可以用這個函數中創建對象:

void create(Type** result) 
{ 
    *result = new Type(); 
} 

//somewhere else in code 
Type* object; 
create(&object); 

這對於創建單個對象的void函數並沒有多大的意義,但是如果函數需要一些預定義的返回類型或者需要創建多個會使得感知的對象。一個典型的例子是IUnknown::QueryInterface()必須返回HRESULT

HRESULT CYourClass::QueryInterface(IID& iid, void** result) 
{ 
    //inside you need to decide whether you know the iid passed, copy a pointer 
    // into *ppv and then return apropriate HRESULT 
} 
+0

我可以使用指針的指針訪問我們使用第一個指針的變量嗎? – 2010-07-16 06:14:13

+0

是的,當然 - 使用'int ** pp =&p;'通常稱爲「指針指針」。 – sharptooth 2010-07-16 06:15:54

3

它的一個指針的指針。

例如,如果你的操作是在一個函數:

void make_p(int **p, int *t) { 
*p = t; 
} 

int main() { 
int *p; 
int t; 
make_p(&p, &t); 
} 
1

它,所以我們可以有其他指針指向改變。指向指針的指針。考慮以下幾點:

int *p1 = &j; // j is a int. 
int *p2 = &k; // k is an int. 

int **p; 

p = &p1; //p points at p1. 
*p = p2; //p1 now points to j because p2 is pointing to j. 
//Also we can do this through just plain old variables. 
int l; 
*p = &l; //p1 is now pointing at l 
0

正如int *p;定義的指針intint **s;限定一個指針(一個指向int)。這通常出現在兩種情況下:

首先,如果你想保存的指針爲int數組,你會做這樣的事情:int **arr = malloc(sizeof(int*) * arr_size);

其次,當一個函數需要返回多個值,通過引用返回額外的值是很常見的。 I.e .:

/* Return x, y and error code. */ 
int getVals(int *px, int *py) { 
    *px = x; 
    *py = y; 
    return 0; 
} 

/* Return new object and error code. */ 
int newFoo(struct Foo **out_foo) { 
    struct Foo *f = malloc(sizeof(struct Foo)); 
    f->value = 0; 
    *out_foo = f; 
    return 0; 
}