指向 C 中結構的指標與其他指標的作業方式不同嗎?例如在這段代碼中:
typedef struct node {
int data;
struct node *next;
} node;
void insert(node **head, int data) {
node *new_node = malloc(sizeof(node));
new_node->data = data;
new_node->next = *head;
*head = new_node;
}
int main() {
node *head = NULL;
insert(&head, 6);
為什么我必須使用指向指標的指標,而不能像本例中的陣列那樣在函式中head使用變數:insert
void moidify(int *arr) {
*arr = 3;
}
int main() {
int *array = malloc(8);
*array = 1;
*(array 1) = 2;
moidify(array);
}
在這里我不必傳遞&array給函式。
uj5u.com熱心網友回復:
沒有區別。如果要更改發送到的變數的值,以function使更改在呼叫的函式中可見,則function需要將其地址提供給function,這就是獲取 的地址時所做的事情head。
在moidify(array)您發送指向第一個元素的指標時,array這就是修改陣列資料起作用的原因。如果您想修改array變數本身(通過使其可能指向其他地方),您也必須獲取它的地址。例子:
void moidify(int **arr) {
*arr = realloc(*arr, 128);
if(*arr == NULL) {
perror(__func__);
exit(1);
}
}
int main() {
int *array = malloc(8);
*array = 1;
*(array 1) = 2;
moidify(&array);
}
uj5u.com熱心網友回復:
您必須了解指標是如何作業的才能得到這個。在這里,變數array不是正確的說法,一個陣列。它是一個指向記憶體空間的指標,大小為8 * sizeof(int)。它只包含一個地址。從這個地址你可以訪問陣列的值,你使用這個地址移動到你想要填充或讀取的正確的記憶體空間。
一旦理解了這一點,當您呼叫該moidify函式時,您就不會傳遞陣列。也不是記憶體空間。您正在傳遞記憶體空間的地址。該函式在引數變數中獲取給定地址的副本int *arr。
main因此,您可以像從函式中使用它一樣使用它。
如果你想改變array變數的地址,你需要指定&array接收函式,然后它會使用一個int **引數變數。
您的 struct 示例類似于我剛剛描述的最后一部分,您想更改指向哪個地址head,因此,您需要給&head函式。獲取 的地址head,并能夠修改包含的地址。
您使用一個地址來訪問名為 的記憶體空間head,修改名為 的記憶體空間內的地址,該地址head指向另一個記憶體空間,您的結構真正屬于該記憶體空間。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/462777.html
上一篇:為什么要顯式參考指向結構陣列的指標而不是僅僅通過指標?
下一篇:C 創建指向不同陣列的陣列
