You are on page 1of 16

PROGRAMIRANJE I

A10 – Pokazivači

dr Dražen Brđanin (drazen.brdjanin@etf.unibl.org)


Goran Banjac (goran.banjac@etf.unibl.org)
Danijela Banjac (danijela.banjac@etf.unibl.org)
Nikola Obradović (nikola.obradovic@etf.unibl.org)
Igor Ševo, Aleksandar Keleč

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

for (i = 0; i < n; i++) 5


for (j = 0; j < m; j++)
{ Dimenzije:
6
2 3
printf("mat[%d][%d]=", i, j); mat[0][0]=1
7
scanf("%d", &mat[i][j]); mat[0][1]=2
} 8
mat[0][2]=3
printf("Matrica:\n"); 9
p = mat; mat[1][0]=4
for (i = 0; i < n; i++, printf("\n")) mat[1][1]=5
for (j = 0; j < m; j++) mat[1][2]=6
printf(" %4d", *(p + i * MAX + j)); Matrica:
// printf(" %4d", *(&mat[0][0] + i * MAX + j)); 1 2 3
// printf(" %4d", mat[i][j]); 4 5 6
return 0;
}
Pokazivači 6
A10 ADRESNA ARITMETIKA
Adresna aritmetika *c=a *i=1
#include <stdio.h> *pc1=a *pi1=1
int main() *(pc1+1)=b *(pi1+2)=3
{
*++pc1=b *++pi1=2
char c[] = { 'a', 'b', 'c', 'd' };
int i[] = { 1, 2, 3, 4 }; *pc1++=b *pi1++=2
char *pc1 = &c[0], *pc2 = &c[3]; *pc1=c *pi1=3
int *pi1 = &i[0], *pi2 = &i[3]; *pc1=a *pi1=1
printf("*c=%c *i=%d\n", *c, *i); pc2-pc1=3 pi2-pi1=3
printf("*pc1=%c *pi1=%d\n", *pc1, *pi1);
printf("*(pc1+1)=%c *(pi1+2)=%d\n", *(pc1 + 1), *(pi1 + 2));
printf("*++pc1=%c *++pi1=%d\n", *++pc1, *++pi1);
printf("*pc1++=%c *pi1++=%d\n", *pc1++, *pi1++);
printf("*pc1=%c *pi1=%d\n", *pc1, *pi1);
pc1 -= 2; pi1 -= 2;
printf("*pc1=%c *pi1=%d\n", *pc1, *pi1);
printf("pc2-pc1=%d pi2-pi1=%d\n", pc2 - pc1, pi2 - pi1);
return 0;
}

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

void sortiraj(ARTIKAL *niz, int n)


{
int i, j;
for (i = 0; i < n - 1; i++)
for (j = i + 1; j < n; j++)
if (niz[i].kol * niz[i].cijena <
niz[j].kol * niz[j].cijena)
{
ARTIKAL pom = niz[i];
niz[i] = niz[j];
niz[j] = pom;
}
}

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

void ispis(ARTIKAL *niz, int n)


{
int i;
printf("=== ==================== ====== ====== ======\n");
printf("RB. NAZIV KOL. CIJENA UKUPNO\n");
n=2
printf("=== ==================== ====== ====== ======\n");
Podaci o 1. artiklu:
for (i = 0; i < n; i++) Naziv: Banane
{ Kolicina: 1.5
printf("%2d. ", i + 1); Cijena: 2
pisi(niz + i); Podaci o 2. artiklu:
printf("\n"); Naziv: Jabuke
Kolicina: 2.5
} Cijena: 1.5
printf("=== ==================== ====== ====== ======");
=== ==================== ====== ====== ======
} RB. NAZIV KOL. CIJENA UKUPNO
=== ==================== ====== ====== ======
1. Jabuke 2.50 1.50 3.75
2. Banane 1.50 2.00 3.00
=== ==================== ====== ====== ======

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

You might also like