Professional Documents
Culture Documents
A10 – Pokazivači
2021.
A10 OPERATORI ZA RAD SA POKAZIVAČIMA
Operatori za rad s pokazivačima 0028FF20h
#include <stdio.h> 0 0 0028FF1Fh
int main() i
{ 0 A
B 0028FF1Eh
short i = 10, j = 20, *p = &i; 0 0 0028FF1Dh
printf("Velicina: %d %d %d\n", j
sizeof(i), sizeof(j), sizeof(p)); 1 4
5 0028FF1Ch
printf("i=%d, adr: %p, ", i, &i); 0 0 0028FF1Bh
printf("j=%d, adr: %p\n", j, &j);
printf("*p=%d, p=%p, adr: %p\n", *p, p, &p); 2 8 0028FF1Ah
*p = 11; p 0028FF19h
F F
printf("i=%d, *p=%d\n", i, *p);
p = &j; 1 C
E 0028FF18h
printf("*p=%d, p=%p\n", *p, p); 0028FF17h
(*p)++;
printf("j=%d, *p=%d\n", j, *p);
return 0; Velicina: 2 2 4
} i=10, adr: 0028FF1E, j=20,
adr: 0028FF1C
*p=10, p=0028FF1E, adr: 0028FF18
i=11, *p=11
*p=20, p=0028FF1C
j=21, *p=21
Pokazivači 2
A10 POKAZIVAČI I STRUKTURE
Pristup elementima strukture
#include <stdio.h>
struct datum
{
int dan, mjesec, godina;
};
int main()
{
struct datum d, *p = &d;
p->dan = 1; // (*p).dan = 1;
p->mjesec = 1; // (*p).mjesec = 1;
p->godina = 2000; // (*p).godina = 2000;
printf("Datum: %02d.%02d.%d.\n", d.dan, d.mjesec, d.godina);
printf("Unesite datum: ");
scanf("%d %d %d", &p->dan, &p->mjesec, &p->godina);
printf("Novi datum: %02d.%02d.%d.", p->dan, p->mjesec, p->godina);
return 0;
}
Datum: 01.01.2000.
Unesite datum: 4 4 2010
Novi datum: 04.04.2010.
Pokazivači 3
A10 POKAZIVAČI I POLJA
Pokazivač na vektor (jednodimenzioni niz) 1 2 3
#include <stdio.h> 1 2 3
int main() 1 2 3
{
1 2 3
int niz[5] = { 1, 2, 3, 4, 5 };
int pr[10] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 }; 5 7 11
int *p = niz; 5 2
printf("%d %d %d\n", niz[0], niz[1], niz[2]);
printf("%d %d %d\n", *p, *(p + 1), *(p + 2));
printf("%d %d %d\n", *niz, *(niz + 1), *(niz + 2));
printf("%d %d %d\n", p[0], p[1], p[2]);
p = pr + 2; p
printf("%d %d %d\n", p[0], p[1], p[2]);
// niz = p; GRESKA
niz[0] = p[0];
p[1] = niz[1]; niz 15 2 3 4 5
printf("%d %d\n", niz[0], p[1]);
0 1 2 3 4
return 0;
} pr 2 3 5 72 11 13 17 19 23 29
0 1 2 3 4 5 6 7 8 9
p
Pokazivači 4
A10 POKAZIVAČI I POLJA
Prenos vektora u funkciju pomoću pokazivača n=3
#include <stdio.h> #include <stdio.h> 1. broj: 5
#define MAX 100 #define MAX 100 2. broj: 1
int suma(int niz[], int n) int suma(int *niz, int n)
3. broj: 9
{ {
int i, s = 0; int i, s = 0; Suma: 15
for (i = 0; i < n; i++) for (i = 0; i < n; i++)
s += niz[i]; // s += *(niz + i); s += *(niz + i); // s += niz[i];
return s; return s;
} }
int main() int main()
{ {
int i, n, niz[MAX]; int i, n, niz[MAX];
do { printf("n="); scanf("%d", &n); do { printf("n="); scanf("%d", &n);
} while (n < 1 || n > MAX); } while (n < 1 || n > MAX);
for (i = 0; i < n; i++) for (i = 0; i < n; i++)
{ {
printf("%d. broj: ", i + 1); printf("%d. broj: ", i + 1);
scanf("%d", niz + i); // &niz[i] scanf("%d", niz + i); // &niz[i]
} }
printf("Suma: %d", suma(niz, n)); printf("Suma: %d", suma(niz, n));
return 0; return 0;
} }
Pokazivači 5
A10 POKAZIVAČI I POLJA
Pokazivač na matricu (dvodimenziono polje)
0 1 2 3 4 5 6 7 8 9
#include <stdio.h>
#define MAX 10 0 1 2 3
int main() 1 4 5 6
{
int i, j, n, m, mat[MAX][MAX], *p; 2
do { 3
printf("Dimenzije: "); scanf("%d %d", &n, &m);
} while (n < 1 || n > MAX || m < 1 || m > MAX); 4
Pokazivači 7
A10 PRENOS ARGUMENATA REFERISANJEM
Napisati program koji učitava niz od n cijelih brojeva, a zatim ispisuje njihovu aritmetičku
sredinu i one učitane brojeve koji su veći od sredine.
Za učitavanje dimenzije i elemenata niza treba definisati i koristiti funkciju čiji je prototip:
void citaj(int *niz, int *n);
#include <stdio.h> void citaj(int *niz, int *n)
#define MAX 100 {
void citaj(int *, int *); int i;
int main() do
{ {
int i, n, niz[MAX], s = 0; printf("n=");
double as; scanf("%d", n);
citaj(niz, &n); }
for (i = 0; i < n; i++) while (*n < 1 || *n > MAX);
s += niz[i]; for (i = 0; i < *n; i++)
as = (double)s / n; { n=4
printf("Sredina: %.2lf\n", as); 1. broj:
printf("%d. 3 ", i + 1);
broj:
printf("Veci su:"); 2. broj:
scanf("%d", niz 4+ i);
for (i = 0; i < n; i++) } 3. broj: 5
if (niz[i] > as) } 4. broj: 6
printf(" %d", niz[i]); Sredina: 4.50
return 0;
Veci su: 5 6
}
Pokazivači 8
A10 DINAMIČKA ALOKACIJA MEMORIJE
Dinamička alokacija memorije
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
int main() int* citaj(int *);
{ int main()
int i, n, *niz; {
do int i, n, *niz;
{ niz = citaj(&n); printf("Niz:");
printf("n="); for (i = 0; i < n; i++)
scanf("%d", &n); printf(" %d", niz[i]);
} free(niz);
while (n < 1); return 0;
niz = (int *)malloc(n * sizeof(int)); }
for (i = 0; i < n; i++) int* citaj(int *n)
{ {
printf("%d. broj: ", i + 1); int i, *niz;
scanf("%d", niz + i); n=4
do { printf("n="); scanf("%d", n);
} } while 1.
(*nbroj:
< 1); 3
printf("Niz:"); niz = (int *)malloc(*n
2. broj: 12 * sizeof(int));
for (i = 0; i < n; i++) for (i =3.0;broj:
i < *n;
4 i++)
printf(" %d", niz[i]); { printf("%d. broj: ", i + 1);
free(niz);
4. broj: 1
scanf("%d", niz + i); }
return 0; Niz: 3 12 4 1
return niz;
} }
Pokazivači 9
A10 DINAMIČKA ALOKACIJA MEMORIJE
Dinamička alokacija memorije
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i, j, n, m, **mat, b = 0;
do { printf("Dimenzije: "); scanf("%d %d", &n, &m); } while (n < 1 || m < 1);
mat = (int **)calloc(n, sizeof(int *));
for (i = 0; i < n; i++)
{
mat[i] = (int *)calloc(m, sizeof(int));
// *(mat + i) = (int *)calloc(m, sizeof(int));
for (j = 0; j < m; j++, b++)
mat[i][j] = b; // *(*(mat + i) + j) = b;
}
printf("Matrica:\n");
for (i = 0; i < n; i++, printf("\n")) Dimenzije: 3 4
for (j = 0; j < m; j++) Matrica:
printf(" %4d", mat[i][j]); // *(*(mat + i) + j)) 0 1 2 3
for (i = 0; i < n; i++) 4 5 6 7
free(mat[i]); // free(*(mat + i));
free(mat);
8 9 10 11
return 0;
}
Pokazivači 10
A10 DINAMIČKA ALOKACIJA MEMORIJE
Napisati program u kojem treba:
• definisati tip ARTIKAL kojim se reprezentuju artikli čiji su atributi naziv, količina i cijena.
• definisati funkciju koja sa standardnog ulaza učitava podatke o jednom artiklu, a čiji je
prototip:
void citaj(ARTIKAL *);
• definisati funkciju za sortiranje niza podataka o artiklima u opadajućem redoslijedu po
ukupnoj vrijednosti, a čiji je prototip:
void sortiraj(ARTIKAL *, int);
• definisati funkciju koja na standardni izlaz ispisuje podatake o artiklu, a čiji je prototip:
void pisi(ARTIKAL *);
• definisati funkciju koja ispisuje niz podataka o artiklima (koristeći funkciju pisi) u obliku
RB. NAZIV KOL. CIJENA UKUPNO
a čiji je prototip:
void ispis(ARTIKAL *, int);
• u glavnom programu:
učitati podatke za n artikala koristeći funkciju citaj i formirati odgovarajući
dinamički niz,
sortirati učitani niz pomoću funkcije sortiraj,
ispisati sortirani niz pomoću funkcije ispis.
Pokazivači 11
A10 DINAMIČKA ALOKACIJA MEMORIJE
Rješenje:
#include <stdio.h>
#include <stdlib.h>
typedef struct artikal
{
char naziv[21]; double kol, cijena;
} ARTIKAL;
void citaj(ARTIKAL *);
void sortiraj(ARTIKAL *, int);
void pisi(ARTIKAL *);
void ispis(ARTIKAL *, int);
int main()
{
int i, n;
ARTIKAL *niz;
do { printf("n="); scanf("%d", &n); } while (n < 1);
niz = (ARTIKAL *)malloc(n * sizeof(ARTIKAL));
for (i = 0; i < n; i++)
{ printf("Podaci o %d. artiklu:\n", i + 1); citaj(niz + i); }
sortiraj(niz, n);
ispis(niz, n);
free(niz);
return 0;
}
Pokazivači 12
A10 DINAMIČKA ALOKACIJA MEMORIJE
void citaj(ARTIKAL *art)
{
printf(" Naziv: "); scanf("%s", art->naziv);
printf(" Kolicina: "); scanf("%lf", &art->kol);
printf(" Cijena: "); scanf("%lf", &art->cijena);
}
Pokazivači 13
A10 DINAMIČKA ALOKACIJA MEMORIJE
void pisi(ARTIKAL *art)
{
printf("%-20s %6.2lf %6.2lf %6.2lf",
art->naziv, art->kol, art->cijena, art->kol * art->cijena);
}
Pokazivači 14
A10 ZADACI ZA VJEŽBU
1. Napisati program koji učitava niz cijelih brojeva, a zatim ga sortira u rastućem redoslijedu.
Za učitavanje niza cijelih brojeva treba definisati i koristiti funkciju čiji je prototip:
void citaj(int *, int *);
Za sortiranje niza cijelih brojeva treba definisati i koristiti funkciju čiji je prototip:
void sort(int *, int);
Za ispis niza cijelih brojeva treba definisati i koristiti funkciju čiji je prototip:
void pisi(int *, int);
2. Definisati tip TACKA kojim se reprezentuje tačka u x0y koordinatnom sistemu (svaka tačka
ima odgovarajuću slovnu oznaku, te dvije realne koordinate).
Definisati tip TROUGAO kojim se reprezentuje trougao u x0y koordinatnom sistemu (svaki
trougao čine tri tačke koje predstavljaju vrhove trougla).
Napisati program koji sa standardnog ulaza učitava četiri tačke, a zatim formira trougao od
prve tri tačke, i na kraju provjerava da li se četvrta tačka nalazi u tom trouglu.
Za učitavanje tačke treba definisati i koristiti funkciju čiji je prototip:
void citaj(TACKA *);
Za formiranje trougla treba definisati i koristiti funkciju čiji je prototip:
TROUGAO trougao(TACKA *);
Za provjeru da li se tačka nalazi unutar trougla treba definisati i koristiti funkciju čiji je
prototip:
int tackaUtrouglu(TACKA, TROUGAO);
Pokazivači 15
A10 ZADACI ZA VJEŽBU
3. Napisati program u kojem treba:
• definisati tip TIM kojim se reprezentuje fudbalski tim čiji su atributi naziv, broj
postignutih i primljenih golova, te broj bodova.
• definisati funkciju koja sa standardnog ulaza učitava podatke o jednom timu, a čiji je
prototip:
void ucitaj(TIM *);
• definisati funkciju koja učitava prirodan broj n i podatke za n timova koristeći funkciju
ucitaj, te formira i vraća dinamički niz, a čiji je prototip:
TIM* formiraj(int *);
• definisati funkciju za sortiranje niza podataka o timovima prema opadajućoj vrijednosti
broja bodova (ako ima više timova sa istim brojem bodova, dodatni kriterijum za
sortiranje je gol razlika). Prototip funkcije je:
void sortiraj(TIM *, int);
• definisati funkciju koja ispisuje sortirani niz podataka o timovima u obliku
RB. NAZIV GPO GPR GR BOD
a čiji je prototip:
void ispisi(TIM *, int);
• u glavnom programu:
učitati podatke za n timova i formirati odgovarajući dinamički niz koristeći funkciju
formiraj,
sortirati učitani niz pomoću funkcije sortiraj, pa ga ispisati pomoću funkcije ispisi.
Pokazivači 16