Wątek przeniesiony 2014-12-23 13:38 z C/C++ przez ŁF.

Zmiana wartości wskaźnika.

0

Otóż problem jest taki:

Dajmy na to, że istnieje struktura:

typedef struct klasa
{
     int wartosc;
} moja;

oraz obiekt struktury, który jest wskaźnikiem do jej obiektu:

moja * wsk = NULL

Znajduję się o w funkcji main().

Gdzieś w programie natomiast mam funkcje zmien(). Jej ciało wygląda tak:

void zmien(moja *wsk_f)
{
    moja *tmp;
    tmp = (moja *)malloc(sizeof(moja));
    tmp->wartosc = 2;
    wsk_f = tmp;
}

Teraz wywołuje już maina:

int main()
{
      moja * wsk = NULL
      zmien(wsk);
      if(wsk)
      printf("%d", wsk->wartosc);
}

Intencją moją jest by wysłać do funkcji wskaźnik wsk, stworzyć nowy obiekt, do którego będę się mógł odwołać w maina. Jednakże linijka:

wsk_f = tmp;

nie działa, gdyż, jak się domyślam, wsk i wsk_f, to dwa różne obiekty i wsk dalej wskazuje na NULLa. Sytuacja taka jakbym miał funkcje fun(int n) i wywołał ją fun(k). Tak naprawdę nie zmieniam k, a jej kopie. Jak więc wysłać wskaźnik wsk do funkcji zmien, by móc na nim manipulować (a nie na jego "kopii"), czyli zmienić adres na który wskazuję? Mógłbym zwrócić ten wskaźnik jako argument zwracany przez funkcję, ale nie zadowala mnie to. Jest to zagadnienie związane z listami. Mam nadzieje, że problem jest zrozumiały.

Dziękuję.

`dodanie znaczników i ``` - @furious programming

2

A to rozumiesz:

void zmien(int wsk_f)
{
    wsk_f=666;
}

int main()
{
      int wsk=0;
      zmien(wsk);
      printf("I nadal jest zerem: %d", wsk);
}

Bo to dokładnie ten sam efekt.

3

Jeśli chcesz zmienić zmienną, to przekazujesz wskaźnik do tej zmiennej. Jeśli chcesz zmienić wskaźnik, to przekazujesz wskaźnik do wskaźnika.

void zmien(moja** wsk)
{
    *wsk = nowa_wartosc;
}

int main()
{
    moja* wsk = NULL;
    zmien(&wsk);
}
1

Wskaźnik to wartość, przekazujesz kopię wartości i to ją zmieniasz.

Jeśli to Ci pomoże, postaraj się myśleć o wskaźniku jak o wizytówce. Masz pustą wizytówkę (NULL). Robisz jej ksero i przekazujesz funkcji zmien. Ta funkcja na swojej dopisuje "Jasiu Kowalski mieszka pod adresem 0x42ab0004". Na Twojej wciąż nic nie ma. Koniec.

0

Jak najbardziej. Czy mam rozumieć, że w tym przypadku będę potrzebował wskaźnika na wskaźnik? Starałem się coś takiego zaimplementować, ale jest to problematyczne dla mnie.

@up: Twonek, o coś takiego mi chodziło, po prostu miałem problemy z implementacją. Dzięki.

2

Może lepiej używać to w ten sposób:

#include <stdio.h>

typedef struct { int wartosc; } moja;

moja *zmien()
  {
   moja *tmp;
   tmp=(moja*)malloc(sizeof(moja));
   tmp->wartosc=2;
   return tmp;
  }

int main()
  {
   moja *wsk=zmien();
   if(wsk) printf("%d",wsk->wartosc);
   return 0;
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1