Wskaźniki
Adres zmiennej - operator &
Operator referencji &
zwraca adres zmiennej
#include<stdio.h> int main() { int a = 42; printf("adres zmiennej a %p\n", &a); }
Deklaracja zmiennej wskaźnikowej
#include<stdio.h> int main() { int a = 42; int *w; w = &a; printf("adres zmiennej a %p\n", w); printf("adres zmiennej a %p\n", &a); }
Dostęp do adresu - operator *
Operator dereferencji *
udostępnia wartość z danego adresu
#include<stdio.h> int main() { int a = 42; int *w = &a; *w = 13; printf("a = %d\n", a); }
Wskaźnik argumentem funkcji
Adres zmiennej przekazany w argumencie funkcji pozwala tej funkcji zmodyfikować wartość wskazywanej zmiennej
#include<stdio.h> void fun(int *a) { *a = 42; } int main() { int a = 1; fun( &a ); printf("a = %d\n", a); }
Zadanie - zamiana
Zaimplementuj funkcję o nazwie zamiana
, która pozwala zamienić wartości dwóch zmiennych typu float
.
Przetestuj działanie tej funkcji.
Zadanie - układ równań
Zaimplementuj funkcję rozwiązującą układ równań z 2 niewiadomymi.
ax + by = c
dx + ey = f
Argumenty funkcji: liczby rzeczywiste a
, b
, c
, d
, e
, f
defilujące układ równań oraz zmienne wskaźnikowe x
, y
, do których zostanie wstawiony wynik.
Wartość zwracana z funkcji: liczba całkowita równa:
- -1 gdy układ jest sprzeczny (brak rozwiązań), zmienne
x
iy
nie są modyfikowane - 0 gdy układ jest niejednoznaczny (posiada wiele rozwiązań), zmienne
x
iy
nie są modyfikowane - 1 gdy istnieje jednoznaczne rozwiązanie, do zmiennych wskazywanych przez
x
iy
umieszczane jest rozwiązanie układu.
Napisz program, który wczyta wartości defilujące układ równań a następnie, korzystając z powyższej funkcji, wyznaczy rozwiązanie układu równań.
Przykład działania:
Podaj wspolczynniki ukladu rownan: 3 5 17 2 -3 5 Rozwiazanie x=4.000000, y=1.000000
Podaj wspolczynniki ukladu rownan: -1 -1 3 1 1 -3 Uklad rownan jest nioznaczony
Podaj wspolczynniki ukladu rownan: 1 2 3 1 2 4 Uklad rownan jest sprzeczny
Zadanie - dominanta
Zaimplementuj funkcję, która zwróci dominantę oraz liczbę wystąpień dominanty z danego ciągu liczb rzeczywistych.
Argumenty funkcji: tablica t
liczb rzeczywistych, liczba całkowita n
określająca ilość liczb w tablicy t
, wskaźnik do zmiennej x
, która po zakończeniu funkcji będzie zawierała wartość dominującą z tablicy t
.
Wartość zwracana z funkcji: liczba całkowita określająca ilość wystąpień dominanty
Napisz program, który wczyta z klawiatury n
liczb rzeczywistych i korzystając z powyższej funkcji wyznaczy wartość dominującą a następnie wypisze wynik.
Plik stat.c zawiera funkcje wczytaj
i wypisz
, które można użyć w zadaniu.
Przykład działania:
Ile liczb? 5 Podaj liczby: 5 -3 5 5 4 Diminanata to 5 Ilosc wystapien 3
Tablice i wskaźniki
Tablica jest zmienną wskaźnikową
- Zmienna tablicowa zawiera adres początku tablicy, tzn.
tab
to to samo co&{tab[0]}
- Dodanie wartości całkowitej do wskaźnika powoduje przesunięcie się do kolejnego elementu w tablicy (pamięci)
- Adres
i
-tego elementu tablicy&(tab[i])
totab+i
- Dostęp do
i
-tego elementu tablicytab[i]
to*(tab+i)
- Adresu przypisanego do zmiennej tablicowej nie można modyfikować, tzn. niedozwolona jest operacja
tab++
#include<stdio.h> int main() { int t[10]; int *p; int i; for( p=t; p < t+10; p++ ) *p = 42; for(i=0; i<10; i++) printf("%d\n", *(t+i)); }
Zadanie - Odwracanie kolejności
Zaimplementuj funkcję odwroc
, która odwróci kolejność elementów w tablicy z liczbami rzeczywistymi. W implementacji tej funkcji nie używaj indeksowania tablicy za pomocą liczb całkowitych lecz użyj wyłącznie zmiennych wskaźnikowych oraz funkcji zamiana
z poprzedniego zadania.
Argumenty funkcji: tablica t
liczb rzeczywistych, liczba całkowita n
określająca ilość liczb w tablicy t
Wartość zwracana z funkcji: adres tablicy t
zawierającej elementy w odwrotnej kolejności
Napisz program, który wczyta z klawiatury n
liczb rzeczywistych do tablicy i korzystając z powyższej funkcji odwróci kolejność elementów a następnie wypisze wszystkie elementy tablicy.
Plik stat.c zawiera funkcje wczytaj
i wypisz
, które można użyć w zadaniu.
Zadania domowe
- we wszystkich funkcjach z zajęć dotyczących tablicy liczb rzeczywistych (wczytaj, wyswietl, srednia itd.) wprowadź wskaźniki zamiast indeksowania tablic zmienną całkowitą
- zaimplementuj funkcję
pierwiastki
, która wyznacza pierwiastki paraboli. Argumentami funkcji są współczynnikia
,b
ic
równania kwadratowego oraz adresy zmiennychx1
ix2
, do których zostaną wstawione wartości miejsc zerowych. Funkcja zwraca wartość 0, 1 lub 2 informującą o liczbie miejsc zerowych.