Почему указатель на указатель на структуру работает в следующем коде, но не в одном указателе - PullRequest
0 голосов
/ 18 марта 2020
#include<stdio.h>
#include<stdlib.h>

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

void push(node* head,int d);

int main()
{
  node* head = NULL;
  int n;
  scanf("%d",&n);
  while(n!=-1){
    push(head,n);
    scanf("%d",&n);
  }

  node* temp = head;
  while(temp!=NULL){
    printf("%d ->",temp->data);
    temp=temp->next;
  }
  printf("NULL");
}

void push(node* head,int d)
{
  node* new = (node*)malloc(sizeof(node));
  new->data=d;
  if(head==NULL){
    new->next=NULL;
    head=new;
  }else {
    new->next=head;
    head=new;
  }

}

Приведенный выше код не работает. Должны отображаться элементы, введенные до ввода -1, но это не так.

push(head,n);

void push(node** head,int d)
{
  node* new = (node*)malloc(sizeof(node));
  new->data=d;
  if(*head==NULL){
    new->next=NULL;
    *head=new;
  }else {
    new->next=*head;
    *head=new;
  }

}

После добавления этих двух изменений код работает нормально , Почему замена одного указателя на двойной указатель заставляет код работать, а все остальное остается неизменным?

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Хорошо. Когда вы хотите изменить целочисленную переменную внутри функции, вы передаете ее по ссылке. То есть вы передаете его адрес.

int x = 5;

void change_value (int* x)
{
    (*x) = 7; // is not 5 anymore
}

С указателями тоже самое. Если вы хотите изменить указатель. Вы должны передать его по ссылке. То есть вы должны передать его адрес. Который является указателем на указатель.

int* ptr_x = &x;

void change_pointer (int** ptr_x)
{
    *ptr_x = NULL; // is not &x anymore
}

В вашем первом коде:

head = new;

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

0 голосов
/ 18 марта 2020

Сначала вы должны взглянуть на работу указателя в целом, вам понадобятся знания.

Для вашего вопроса

node* head = NULL; //a pointer, so basically an int
push(head,n); //just passes this int as a copy, so any changes will just affect copy and wont be passed back.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...