2014-04-20 120 views
0

是什麼這樣的區別:指針指針的意義是什麼?

int i = 5, j = 6, k = 7; 
int *ip1 = &i, *ip2 = &j; 



int *ipp = ip1; 

,做這樣的:

int **ipp2 = &ip1; 

不要他們做同樣的事情?持有指向變量的指針(ip1),我?

+1

沒有,第二點'ip1'。 – chris

+1

一個是'int *',另一個是'int **' - 你是指「做同樣的事情」是什麼意思?它們甚至不是同一類型。 –

+0

如果ipp沒有指向ip1,那麼ipp會做什麼? – onemic

回答

1

所有的變量在內存中的位置都保存着它們的值。讓我們來探討的iip1ippipp2

值之間的關係,這是在執行該語句i = 5;時,你會得到什麼。 i已在內存中的位置,並在位置的值設置爲5

i ->  +--------+ 
     | 5  | 
     +--------+ 
     ^
     | 
     A1 (address of i) 

這就是執行語句int* ip1 = &i;時得到的結果。 ip1在內存中的位置,該位置的值設置爲i的地址,我們將其指定爲A1

ip1 -> +--------+ 
     | A1 | 
     +--------+ 
     ^
     | 
     A2 (address of ip1) 

這是執行語句int* ipp = ip1;時發生的情況。存儲位置ipp的值設置爲ip1的值,即A1

ipp -> +--------+ 
     | A1 | 
     +--------+ 
     ^
     | 
     A3 (address of ipp) 

這是執行語句int** ipp2 = &ipp;時發生的情況。存儲位置ipp2的值設置爲A3,這是ip1的地址。

ipp2 -> +--------+ 
     | A3 | 
     +--------+ 
     ^
     | 
     A4 (address of ipp2) 

如何提領的工作:

*ip1 = *A1 = 5 
*ipp = *A1 = 5 
*ipp2 = *A3 = A1 
**ipp2 = **A3 = *A1 = 5 
2

ipp2指向ip1。這與指向i完全不同。

樣品的編號:

int *ip1 = &i; 
int **ipp2 = &ip1; 
printf("%d\n", **ipp2); // 5 
ip1 = &j; 
printf("%d\n", **ipp2); // 6 
0

很簡單:一個指針是其中變量保持在存儲器中的地址。由於指針本身就是一個變量,因此它的地址可以存儲在另一個指針中,依此類推。爲了更好地記住一個指針是如何工作的,只要認爲它是一個地址即可。指針的類型,即intint *中引用指向的數據類型,並影響指針如何對加法或減法做出「反應」,如指針算術中所述。 A「指向INT的指針」是一個int**,所以總是指向一個int*的地址,並增加時它將地址移動到根據需要以指向下一個int*

1

指針經常被用來作爲多字節更改函數內某個變量的值:

void incr(int *ip) { *ip++; } 
void f() { int i = 0; incr(&i); printf("%d\n", i); // 1 

現在,它與指向指針的指針沒有任何區別。您可以將指針傳遞給指向函數的指針,並且該函數可以更改指針指向的內容:原始指針!

char *mom = "mom"; 
char *pop = "pop"; 
chooseMomOrPop(int choosePop, char **momOrPop) { *momOrPop = choosePop ? pop : mom; } 
void f() { char *mp = mom; chooseMomOrPop(1, &mom); printf("%s\n", mom); } // pop