Wskaźniki

Program demonstrujący użycie wskaźników

#include <stdio.h>
 
int main()
{
   int x = 100;
   char napis[] = "jezyki programowania\n";
   int tab[5] = {100, 101, 102, 103, 104};
 
   int *wsk1, *wsk2;   // tworzymy wskaznik (do) typu int
   char* wsk3;
 
   wsk1 = &x;   // przypisanie wartosci (adresu)
   printf("wsk1=&x     | x=%d   *wsk1=%d\n",x,*wsk1);
   printf("adres x     | &x=%x,   wsk1=%x\n",&x,wsk1);
   *wsk1 = 5;
   printf("*wsk1=5     | x=%d  *wsk1=%d\n",x,*wsk1);
 
   printf("tymczasem  *wsk2=%d\n",*wsk2);   
   wsk2 = wsk1;
   printf("wsk2=wsk1   | *wsk2=%d\n",*wsk2);
 
   x++;
   printf("x++         | *wsk1=%d,  *wsk2=%d, x=%d\n",*wsk1,*wsk2,x);
   (*wsk1)++;
   printf("(*wsk1)++   | *wsk1=%d,  *wsk2=%d, x=%d\n",*wsk1,*wsk2,x);
 
   wsk1 = tab;   // to samo co wsk1 = &tab[0]
   printf("teraz wsk1 pokazuje na elementy tablicy\nwsk1=tab    | *wsk1=%d,  *wsk2=%d, x=%d\n",*wsk1,*wsk2,x);
 
   wsk1 = wsk1 + 2;
   printf("wsk1=wsk1+2 | *wsk1=%d,",*wsk1);
   printf(" tab[2]=%d, *(tab+2)=%d\n",tab[2],*(tab+2));
 
   wsk3 = napis + 4;
   printf(wsk3);
 
   return 0;
}

Ćwiczenia

  • przerób poniższy program tak aby do manipulowania elementami tablicy wykorzystywał wskaźniki zamiast zmiennej indeksującej i. Program wykorzystuje pliki z poprzednich zajęć tab.c i tab.h (z poprzednich zajęć)
#include <stdio.h>
#include "tablice.h"
#define MAX 100
 
int main()
{
   int n,i;
   float tablica[MAX];
   float t;
 
   printf("Ile elementow (nie wiecej niz MAX)");
   scanf("%d",&n);
 
   wczytaj(tablica,n);
 
   i = 0;
   while(i<n/2)
   {
      t = tablica[i];
      tablica[i] = tablica[n-i-1];
      tablica[n-i-1] = t;	
      i++;
   }
 
   wyswietl(tablica,n);
 
   return 0;
}

Ćwiczenie

  • napisz funkcję o nazwie zamien, która zamienia wartości dwóch podanych argumentów typu rzeczywistego
  • dodaj do plików tab.h i tab.c funkcję odwroc, która odwraca kolejność elementów w tablicy (tak jak w przykładzie powyżej). Wykorzystaj w tym celu funkcję zamien. Niech funkcja zwraca wskaźnik do odwróconej tablicy.
#include <stdio.h>
#include "tab.h"
#define MAX 100
 
void zwieksz(float *x);
float *zwieksztab(float *tab,int n);
 
int main()
{
   int n,i;
   float t,tablica[MAX];
 
   printf("Liczbe: ");   scanf("%f",&t);
   zwieksz(&t);
   zwieksz(&t);
   zwieksz(&t);
   printf("Teraz liczba wynosi %f\n",t);
 
   printf("Podaj rozmiar tablicy: ");   scanf("%d",&n);
   wczytaj(tablica,n);
 
   zwieksztab(zwieksztab(zwieksztab(tablica,n),n),n);
 
   printf("Teraz tablica wyglada tak\n");
   wyswietl(tablica,n);
}
 
void zwieksz(float *liczba)
{
   *liczba = *liczba + 1.0;
}
 
float *zwieksztab(float *tab,int n)
{
   float *wt = tab+n;
   while(wt>tab) zwieksz(--wt);
   return tab;
}
  • we wszystkich funkcjach z zajęć dotyczących tablicy liczb rzeczywistych (wczytaj, wyswietl, srednia itd.) wprowadź wskaźniki zamiast indeksowania tablic zmienną całkowitą
  • zmień funkcję pierwiastki (patrz zajęcia 3) tak aby wartością zwracaną była ilość pierwiastków równania kwadratowego oraz wartości tych pierwiastków.