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);
}

wsk1.c

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);
}

wsk2.c

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);
}

wsk3.c

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);
}

wsk4.c

Zaimplementuj funkcję o nazwie zamiana, która pozwala zamienić wartości dwóch zmiennych typu float. Przetestuj działanie tej funkcji.

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 i y nie są modyfikowane
  • 0 gdy układ jest niejednoznaczny (posiada wiele rozwiązań), zmienne x i y nie są modyfikowane
  • 1 gdy istnieje jednoznaczne rozwiązanie, do zmiennych wskazywanych przez x i y 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

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

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]) to tab+i
  • Dostęp do i-tego elementu tablicy tab[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));
}

wsk5.c

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.

  • 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ółczynniki a, b i c równania kwadratowego oraz adresy zmiennych x1 i x2, do których zostaną wstawione wartości miejsc zerowych. Funkcja zwraca wartość 0, 1 lub 2 informującą o liczbie miejsc zerowych.