[英]Can someone explain pointers to pointers to me
最近,我們在大學里談論了有關指針的指針 (例如: char **ppch
),並且據我了解,它們可以用作2D數組,因為例如char *pch
可以用作char
/ string
的數組。
是這種情況還是我錯過了什么? 我不確定我們如何在程序中使用P2P,或者我的理解是否接近正確。
有人可以提供例子嗎? 我們是否需要為這些P2P中的每個元素使用malloc()
分配內存?
數組的固有屬性是,它們的元素在內存中是連續的。 例如。
int foo[] = { 1, 2, 3, 4, 5, /* ... */ };
// ~> 1, 2, 3, 4, 5, ...
2d數組沒有什么不同:
int bar[][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
// ~> 1, 2, 3, 4, 5, 6, 7, 8, 9
但是指向某種類型的指針的指針
int **qux;
就是這樣。 指向一個指針(或多個指針)的指針。 當你分配內存像
int **qux = malloc(N * sizeof(*qux));
您將獲得一個指向內存區域的指針,該指針的大小足以容納指向int
N
指針,而該指針又可以指向其他內存區域:
int **qux = malloc(N * sizeof(*qux));
int value = 0;
for (size_t i = 0; i < N; ++i) {
qux[i] = malloc(P * sizeof(**qux));
for (size_t k = 0; k < P; ++k)
qux[i][k] = ++value;
}
在內存中看起來像
+----------+ +-----+
| qux[0] --|------------------------------|-> 1 |
| qux[1] --|-----------+ | 2 |
| qux[2] --|---+ | +-----+ | 3 |
| ... | | +-------|-> 4 | +-----+
+----------+ | | 5 |
| +-----+ | 6 |
+----|-> 7 | +-----+
| 8 |
| 9 |
+-----+
因此,不,指向指針的指針不是二維數組。 這樣的事情被稱為“鋸齒數組”。
至於您使用字符串的示例,沒有區別:
char **qux; // a pointer to a (number of) pointers to char
qux = malloc(N * sizeof(*foo));
// just an array to fill the memory qux points to with:
char const *source[] = { "foo", "bar", "baz", "qux" /* I'm running out of names */ };
size_t index = 0;
for (size_t i = 0; i < N; ++i) {
qux[i] = malloc((strlen(source[index]) + 1) * sizeof(**qux));
strcpy(qux[i], source[index++]);
}
〜>
+----------+ +--------+
| foo[0] --|------------------------------------------------------|-> 'f' |
| foo[1] --|-----------------------------------+ | 'o' |
| foo[2] --|----------------------+ | +--------+ | 'o' |
| foo[3] --|---+ | +----|-> 'b' | | '\0' |
| ... | | | | 'a' | +--------+
+----------+ | +--------+ | +--------+ | 'r' |
+----|-> 'q' | +---|-> 'b' | | '\0' |
| 'u' | | 'a' | +--------+
| 'x' | | 'z' |
| '\0' | | '\0' |
+--------+ +--------+
相反, char
的真實二維數組:
char foo[][4] = { "foo", "bar", "baz", "qux" /*, ... */ };
// ~> 'f', 'o', 'o', '\0', 'b', 'a', 'r', '\0', 'b', 'a', 'z', '\0', 'q', 'u', 'x', '\0', ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.