путать с указателем на указатель концепции

Передача указателя в основном похожа на передачу указателя в качестве значения … изменения указателя внутри функции не изменят фактическое значение указателя … но когда нам нужно получить доступ к самому действительному указателю в функции, тогда мы придумали указатель на указатель концепции. это мое понимание ..

            struct node
{
int data;
struct node* next;
};

void push(struct node** head_ref, int new_data) // i understand the need of pointer to pointer here, since we are changing the actual value by adding a node..
{
struct node* new_node = (struct node*) malloc(sizeof(struct node));
new_node->data  = new_data;
new_node->next = (*head_ref);
(*head_ref)    = new_node;
}

void insertAfter(struct node* prev_node, int new_data) // why are we not using pointer to pointer here since even here the pointer data is getting modified..??
{
if (prev_node == NULL)
{

return;
}

struct node* new_node =(struct node*) malloc(sizeof(struct node));
new_node->data  = new_data;
new_node->next = prev_node->next;
prev_node->next = new_node;
}

int main()
{
struct node* head = NULL;

append(&head, 6);
insertAfter(head->next, 8);

return 0;
}

Просьба уточнить..
я запутался, почему мы не используем указатель на указатель в InsertAfter (…), а также думал, что мы изменим указатель там?

0

Решение

Разница в том, что функции делают с тем, что вы передаете.

Это изменяет то, что *head_ref сама указывает на:

void push(node** head_ref, int new_data);

Хотя это изменяет содержание node тот prev_node указывает на — но все равно в конечном итоге будет указывать на то же node:

void insertAfter(node* prev_node, int new_data);

Просмотр фактического использования также проясняет это:

// head points to the node 0
node* head = new head{0, nullptr};

// head now points to the node 5, which itself points to the node 0
// so our list is {5} --> {0}
push(&head, 5);
^
additional clue that we are modifying head

// head->next points to the node 0 before this
// it **still** continues to point to that node after the call, but we
// change what comes after it, to now be a new node 3
// so our list is {5} --> {0} --> {3}
insertAfter(head->next, 3);

// head is still the 5. head->next is still the 0.
0

Другие решения

Вы правы в начале, но обычно, если вы хотите изменить исходное значение, вы передаете указатель по ссылке (&) вместо значения (*)

Вот что почитать:
http://courses.washington.edu/css342/zander/css332/passby.html

0

Во второй функции вы не изменяете позицию или адрес prev_node, вы только меняете данные. Так что вам нужно только передать по значению.

0
По вопросам рекламы [email protected]