Wskaźniki - wyjaśnienie podstawowych rzeczy

0

Cześć

Dostałem takie zadanie dot. wskaźników do przerobienia, a jako, że na zajęciach nic nie było o wskaźnikach to swoją wiedzę opieram na internecie.

Zadanie wygląda tak:

int main()
{
    int tab[ 5 ] = { 3 , -5 , 7 , 0 , -4 };
    int x , y, *p1 , *p2 ;
    p1 = &x;
    p2 = &y; 
    *p2 = *(tab+1);
    *p1 = *p2+6;
    *p2 /= 2; 
    *p1 += *(tab+2);

    return 0;
}

Muszę podać jakie wartości mają zmienne x i y po wykonaniu tych instrukcji. Zaczynając od p1 = &x; to, czy dobrze zrozumiałem, że zmienna p1 jest = adresowi zmiennej x? Jeśli zmienna x nie ma określonej wartości to żeby obliczyć jej wartość trzeba policzyć wartości z adresu zmiennej x? Czy chociaż częściowo dobrze to zrozumiałem?

p1 = &x;
printf("wartośc zmiennej x wynosi %d\n", *(&x) );

Pozdrawiam

1
p1 = &x;

Po tej instrukcji p1 zawiera adres zmiennej x, tak jak napisałeś.

Nie rozumiem jednak co masz na myśli mówiąc:

Jeśli zmienna x nie ma określonej wartości to żeby obliczyć jej wartość trzeba policzyć wartości z adresu zmiennej x?

Jeżeli jest niezainicjalizowana to oznacza że może mieć jakąkolwiek wartość (śmieci), nie obliczysz tego.

0

Trudno mi ubrać myśli w słowa, ale chodzi mi o coś takiego, że jest samo int x a nie np. int x = 5. To teraz jak zmienna x nie ma przypisanej żadnej wartości to, czy powinienem użyć tego *(&x)(rozumiem, że to policzy wartość z adresu zmiennej?)

1

&x to jest adres zmiennej x.

W tym programie nie masz liczyć jaka jest wartość początkowa dlatego że ona zostanie zmieniona przez wskaźnik.

Przedstawię prosty kod który pomoże Ci zrozumieć podstawy wskaźników:

int x = 3;
int y = 5;
int* wsk = &y; // Zmienna wsk przechowuje teraz adres zmiennej y.
*wsk = 6; // Za pomocą wskaźnika zmieniamy to na co wskazuje, czyli y, na 6.
wsk = &x; // Wskaźnik przechowuje teraz adres zmiennej x.
0

Trochę mi rozjaśniło to co napisałeś i jeśli nie mam liczyć wartości początkowej to dopisałem na końcu coś takiego:

    printf("Wartosc zmiennej x wynosi %d\n", *p1);
    printf("Wartosc zmiennej y wynosi %d\n", *p2);

I wychodzi odpowiednio 8 i -2. Czy o to chodziło, czy coś źle zrozumiałem?

Pozdrawiam

1

Myślałem że gdy zadanie mówi "Podaj wartości x i y po wykonaniu tych funkcji" to chodzi o to aby odpowiedzieć na kartce czy coś (bez wykonywania kodu). Printf dał Ci odpowiedź ale najważniejsze żebyś rozumiał jak to działa.

0

W takim razie jeszcze raz dzięki za pomoc.

0

Postanowiłem to policzyć ręcznie na kartce i mam pewną nieścisłość.

Jeśli w tej tablicy

int tab[ 5 ] = { 3 , -5 , 7 , 0 , -4 };
tab[0] = 3, tab[1] = -5, tab[2] = 7, tab[3] = 0, tab[4] = -4

Zaczynając liczenie

*p2 = *(tab+1); // Z tego wychodzi y = -5 (y=tab[1])
*p1 = *p2+6; // Z tego wychodzi x = -5+6 = 1 (x=y+6)
*p2 /= 2; // Z tego wychodzi y = -5/2 = -2,5 (y=y/2)
*p1 += *(tab+2); // Z tego wychodzi x = 1+7 = 8 (x=x + tab[2])

Wychodzi mi wartość x = 8 a y = -2,5 Przy użyciu printf wychodzi y = -2 Gdzie popełniam błąd?

2

Wynik dzielenia int przez int zawsze da Ci int. Część ułamkowa zostanie zignorowana.

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