Zmiana wartości wskaźnika za pomocą funkcji

0

Cześć, właśnie piszę listę jednokierunkową na wskaźnikach i generalnie to natknąłem się na kilka poważnych problemów.
Generalnie, to chciałbym móc edytować wewnątrz funkcji wskaźniki, które przesyłam do niej jako argumenty funkcji i to działa, jeżeli zarówno wskaźniki jak i obiekty na które mają pokazywać, są typu int:

#include <iostream>
using namespace std;


//////////////////////////////////////
void zmiana(int **el, int obiekt)
{
	cout << reinterpret_cast<int *>(el) << endl;
	*el = &obiekt;
	cout << reinterpret_cast<int *>(el) << endl;
}
//////////////////////////////////////
int main()
{
	int *ws = 0;
	int obiekt = 5;
	zmiana(&ws, obiekt);
	cout << reinterpret_cast<int *>(ws) << endl;
	return 0;
}

Problem pojawia się wtedy, gdy próbuje stworzyć jednokierunkową listę, nie mam pojęcia, jak wtedy wewnątrz funkcji korzystać ze wskaźników, pokazujących na inne wskaźniki typu lista, czyli struktury mające kilka składników, oto kod:

#include <iostream>
using namespace std;
//////////Struktura listy/////////////
struct list
{
	int value;
	list *next;
};
list *head = 0;

//////////////////////////////////////
void add_el(list **ptr, int obj)
{
	if(*ptr == 0)
	{
		*ptr = new list;
		*ptr->value = obj; // BLAD
		*ptr->next = 0; // BLAD
	}
	else if(*ptr != 0)
	{
		add_el(*ptr->next, obj); // BLAD
	}
}
//////////////////////////////////////
int main()
{

	return 0;
}

Gdyby ktoś mógłby mi pokazać, jak w takim wypadku powinienem skorzystać z tych wskaźników, byłbym bardzo wdzięczny.

0

Ale siekę robisz...

#include <iostream>
using namespace std;
 
 
//////////////////////////////////////
void zmiana(int **el, int *obiekt) // przemyśl jak to teraz zadziała, a jak działało wcześniej
{
        cout << reinterpret_cast<int *>(el) << endl;
        *el = obiekt;
        cout << reinterpret_cast<int *>(el) << endl;
}
//////////////////////////////////////
int main()
{
        int *ws = 0;
        int obiekt = 5;
        zmiana(&ws, &obiekt);
        cout << reinterpret_cast<int *>(ws) << endl;
        return 0;
}

Pomyśl co robi *ptr->value = obj. Wytłumaczę może, przypisujesz wartość do zdereferencjowanego pola value struktury zawartej w ptr, a value jest przecież intem, ojć.

0

[quote]Ale siekę robisz...[/quote]

Niestety, pewnie całą tę listę jednokierunkową da się dużo ładniej napisać.

Odnośnie tego poprawionego kodu nr 1, rozumiem, że tam uzyskiwałem wartość do obiektu umieszczonego na stosie, racja, to nie było zbyt mądre :X

Natomiast tego zdania:
[quote]Pomyśl co robi *ptr->value = obj. Wytłumaczę może, przypisujesz wartość do zdereferencjowanego pola value struktury zawartej w ptr, a value jest przecież intem, ojć.[/quote]

nie bardzo zrozumiałem, można troszkę jaśniej? Przepraszam za kłopot.

0

Proste, operator * ma niższy priorytet niż operator -> czyli to oznacza:

  1. wyciągnij ze struktury w ptr element value (tu masz typ int)
  2. zdereferencjuj go (czyli próbujesz potraktować inta jak wskaźnik)
0

Okej, teraz rozumiem. Czyli zamiast *ptr->value winno być (*ptr)->value. No i teraz jest już mniej błędów, zostało jeden w wywołaniu rekurencyjnym, ale to już kompletnie nie mam pojęcia jak ten problem rozwiązać. Kurczę, przekombinowałem z tymi wskaźnikami i całą tą listą tworzoną w taki sposób :P Dzięki za pomoc.

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