Wątek przeniesiony 2014-12-23 13:38 z przez ŁF. Powód: Wątek dotyczący podstaw

Zmiana wartości wskaźnika.

Odpowiedz Nowy wątek
2014-12-23 12:53
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

edytowany 3x, ostatnio: furious programming, 2014-12-23 17:02
Wstawiaj kod w znaczniki kolorujące składnię; - furious programming 2014-12-23 17:02

Pozostało 580 znaków

2014-12-23 12:57
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.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-12-23 12:59
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);
}

Pozostało 580 znaków

2014-12-23 13:00
kq
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.


edytowany 1x, ostatnio: kq, 2014-12-23 13:00

Pozostało 580 znaków

2014-12-23 13:01
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.

edytowany 1x, ostatnio: Totalq, 2014-12-23 13:02
Tak, zobacz odpowiedź @twonek - kq 2014-12-23 13:02

Pozostało 580 znaków

2014-12-23 13:12
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;
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
#include&lt;stdlib.h&gt; btw: jaka jest korzyść z rzutowania malloc'a? - karolinaa 2014-12-23 18:56
tak, zmieniasz rozszerzenie pliku na .cpp i nadal się kompiluje ;P - _13th_Dragon 2014-12-23 19:23
huh no to tak chyba że tak - karolinaa 2014-12-23 20:49

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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