Skocz do zawartości

Zamiana Adresow Tablic


Lukasz69

Rekomendowane odpowiedzi

Witam - mam program - zamienia tablice ale zamiana adresow dobrze dziala wewnatrz funkcji zamieniajacej ale okazuje sie ze zamiana nie dotyka zmiennych globalnych ( znaczy sie tych z funkcji main) a chyba powinna bo operacje sa na wskaznikach - w czym zrobilem blad - w czym zle rozumuje - prosze o pomoc. Oto program:

#include <iostream>
using namespace std;

const int MAX = 4;

void kopiowanie(char *t1, char *t2)
{
char *tmp;
tmp = t1;
t1 = t2;
t2 = tmp;
}

int main()
{
char zdanie1[MAX], zdanie2[MAX], zlaczone[MAX*2];
wczytaj(zdanie1, 1);
wczytaj(zdanie2, 2);
kopiowanie(zdanie1, zdanie2);
//wypisanie pokazuje ze adresy nie zostaly (_na prawde_ → naprawdę) ORT zmienione a w funcji kopiuj gdy da sie wypisanie wszystko wyglada ok
return 0;
}

Odnośnik do komentarza
Udostępnij na innych stronach

Chodzi o to czy argumentem wywołania jest zmienna, czy jej adres.

Jeżeli zmienna, to adres utworzony lokalnie dotyczy kopii na stosie i mimo że zmiana się odbywa, to ginie natychmiast po wyjściu z funkcji wraz z likwidacją stosu jej parametrów.

Jeżeli adres, to operacja na wskazywanym za jego pomocą bloku pamięci dotyczy ,,prawdziwego'' obszaru alokacji zmiennych, a nie stosu -- bo ten zawiera tylko kopie wskaźników.

 

Patrz: B.W. Kernighan & D. Ritchie: Język C, WNT 1988, rozdział 5.2, str 108.

Nie wystarczy więc napisać

swap(x, y);

jeśli funkcja swap jest zdefiniowana następująco:

swap(x, y)  /* ŹLE */ 
int x, y;
{
int temp;

temp = x;
x = y;
y = temp;
}

[...]Program [...] może przekazać wskaźniki do zamienianych wartości:

swap(&a, &b);

[...] Deklarując w funkcji swap parametry jako wskaźniki przyjmujemy dostęp do rzeczywistych parametrów wywołania funkcji.

swap(px, py);   /* zamień *px i *py */
int *px, *py;
{
int temp;

temp = *px;
*px = *py;
*py = temp;
}

Konwencja określania typu parametrów jest u K&R nieco archaiczna (K&R C != ANSI C != C++), ale ideę przekazywania adresu wyjaśnili wzorowo.

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...