是什麼這樣的區別:指針指針的意義是什麼?
int i = 5, j = 6, k = 7;
int *ip1 = &i, *ip2 = &j;
int *ipp = ip1;
,做這樣的:
int **ipp2 = &ip1;
不要他們做同樣的事情?持有指向變量的指針(ip1),我?
是什麼這樣的區別:指針指針的意義是什麼?
int i = 5, j = 6, k = 7;
int *ip1 = &i, *ip2 = &j;
int *ipp = ip1;
,做這樣的:
int **ipp2 = &ip1;
不要他們做同樣的事情?持有指向變量的指針(ip1),我?
所有的變量在內存中的位置都保存着它們的值。讓我們來探討的i
,ip1
,ipp
和ipp2
值之間的關係,這是在執行該語句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
ipp2
指向ip1
。這與指向i
完全不同。
樣品的編號:
int *ip1 = &i;
int **ipp2 = &ip1;
printf("%d\n", **ipp2); // 5
ip1 = &j;
printf("%d\n", **ipp2); // 6
很簡單:一個指針是其中變量保持在存儲器中的地址。由於指針本身就是一個變量,因此它的地址可以存儲在另一個指針中,依此類推。爲了更好地記住一個指針是如何工作的,只要認爲它是一個地址即可。指針的類型,即int
在int *
中引用指向的數據類型,並影響指針如何對加法或減法做出「反應」,如指針算術中所述。 A「指向INT的指針」是一個int**
,所以總是指向一個int*
的地址,並增加時它將地址移動到根據需要以指向下一個int*
指針經常被用來作爲多字節更改函數內某個變量的值:
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
沒有,第二點'ip1'。 – chris
一個是'int *',另一個是'int **' - 你是指「做同樣的事情」是什麼意思?它們甚至不是同一類型。 –
如果ipp沒有指向ip1,那麼ipp會做什麼? – onemic