[C++] Wskaźniki

Awatar użytkownika
rafcio_100
Użytkownik
Użytkownik
Posty: 77
Rejestracja: 1 kwie 2008, o 13:58
Płeć: Mężczyzna
Lokalizacja: Stasiówka
Podziękował: 23 razy

[C++] Wskaźniki

Post autor: rafcio_100 »

Podaj jakie będą wartości wskazywane przez wskaźniki p1 i p2 po wykonaniu następujących
kawałków kodu:

Kod: Zaznacz cały

const int n = 7;
int *t = new int[n];
int *p1 = t, *p2 = t + n - 1;
int i;
for(i = 0; i < n; i++)
*(t + i) = i;
while(p1 != p2){
*p1 = *p2;
p1++; p2--;
}
p1++; p2--;

Kod: Zaznacz cały

const int n = 8;
int tab[n];
int *p1 = tab, *p2 = tab + n - 1;
for(int i = 0; i < n / 2; i++, p1 += 2, p2 -= 2){
*p1 = i; *p2 = 5;
}
p2++; p1--;
Bardzo proszę o pomoc w zadaniu i jakieś wyjaśnienie, dlaczego takie wyniki.
Gouranga
Użytkownik
Użytkownik
Posty: 1592
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 246 razy

[C++] Wskaźniki

Post autor: Gouranga »

zacznijmy od wyjaśnienia operatorów:
* - wyłuskanie - jeśli x jest wskaźnikiem czyli wskazuje miejsce w pamięci, to *x jest wartością, która jest zapisana pod tym adresem
& - adresowanie - odwrotność * czyli jeśli x jest zmienną i ma swoją wartość to &x pokaże nam adres gdzie w pamięci jest x

teraz kod:

Kod: Zaznacz cały

const int n = 7;
deklarujemy stałą n = 7 (const zabezpiecza zmienną przed zmianą wartości)

Kod: Zaznacz cały

int *t = new int[n];
deklarujemy wskaźnik na int który będzie tablicą intów rozmiaru n

Kod: Zaznacz cały

int *p1 = t, *p2 = t + n - 1;
deklarujemy wskaźnik p1 który wskazuje to samo miejsce co t czyli początek tablicy n intów i p2, który wskazuje miejsce t + n - 1 co dokładnie znaczy że wskazuje na n-1 element tablicy na którą wskazuje t bo te przesunięcia są liczone po wielkości typu czyli t wskazuje miejsce, t+n wskazuje o n intów dalej niż t itd.

Kod: Zaznacz cały

int i;
for(i = 0; i < n; i++)
tego nie trzeba tłumaczyć mam nadzieję

Kod: Zaznacz cały

*(t + i) = i;
weź miejsce na które wskazuje t, przesuń się o i intów w prawo i wyłuskaj z tego adresu, wpisz tam wartość i - ta linia jest dokładnie tym samym co t[i] = i;

Kod: Zaznacz cały

while(p1 != p2){
dopóki p1 i p2 nie wskazują na to samo miejsce

Kod: Zaznacz cały

*p1 = *p2;
niech p1 wskazuje tam gdzie p2 (czyli na t[6] bo nie zmienialiśmy)

Kod: Zaznacz cały

p1++; p2--;
przesuń p1 o 1 w prawo, p2 o 1 w lewo (liczymi w wielkości intów)
po mojemu program po pewnym czasie w tej pętli się wysypie bo p2 będzie się cofał coraz dalej i dalej aż trafi na chronioną część pamięci zajętą przez system/środowisko/inny program

Kod: Zaznacz cały

}
p1++; p2--;
tu nie powinien w ogóle dojść
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10225
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2362 razy

[C++] Wskaźniki

Post autor: Dasio11 »

Gouranga pisze:

Kod: Zaznacz cały

*p1 = *p2;
niech p1 wskazuje tam gdzie p2 (czyli na t[6] bo nie zmienialiśmy)
Nie. To oznacza: do miejsca w pamięci pod adresem p1 zapisz wartość wziętą z miejsca w pamięci pod adresem p2.
Gouranga pisze:

Kod: Zaznacz cały

p1++; p2--;
przesuń p1 o 1 w prawo, p2 o 1 w lewo (liczymi w wielkości intów)
po mojemu program po pewnym czasie w tej pętli się wysypie bo p2 będzie się cofał coraz dalej i dalej aż trafi na chronioną część pamięci zajętą przez system/środowisko/inny program
To też nieprawda. Wykonanie będzie przebiegało tak:

Kod: Zaznacz cały

p1 = t;
p2 = t+6;

*p1 = *p2;   /* Czyli: t[0] = t[6]; */
p1++; p2--; /* p1 = t+1, p2 = t+5; */
[p1 != p2, więc wróć na początek]

*p1 = *p2;   /* Czyli: t[1] = t[5]; */
p1++; p2--; /* p1 = t+2, p2 = t+4; */
[p1 != p2, więc wróć na początek]

*p1 = *p2;   /* Czyli: t[2] = t[4]; */
p1++; p2--; /* p1 = t+3, p2 = t+3; */
[p1 = p2, więc wyjdź z pętli]

Po wyjściu z tej pętli jeszcze raz wykona się p1++; p2--;, więc będzie p1 = t+4, p2 = t+2, zatem *p1 = t[4] = 4 (ta wartość nie była zmieniana) oraz *p2 = t[2] = 4 (bo dokonaliśmy przypisania t[2] = t[4]).
Gouranga
Użytkownik
Użytkownik
Posty: 1592
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 246 razy

[C++] Wskaźniki

Post autor: Gouranga »

Dasio11, istotnie mój błąd, nie zwróciłem uwagi na gwiazdki
ODPOWIEDZ