Professional Documents
Culture Documents
#include <stdio.h>
void main() {
int a[]={1,0}, *p;
p=a;
printf("%d, ", *p++);
printf("%d\n", *p);
}
Odgovori:
A) 1, 2
B) 1, 0
C) 0, 0
Programiranje 2 2009 ETF Beograd
1/34
Pokazivai
Pokaziva je promenljiva koja sadri adresu neke
lokacije u operativnoj memoriji
Adresna aritmetika
Dodela vrednosti
pa = pb;
Definisanje pokazivaa
tip *ime;
pa = pa + x;
nova adresa pa e biti formirana kao zbir stare adrese pa i
x*sizeof(pokazani_tip)
pa = &a;
2/34
*pa = 1;
3/34
4/34
Pokazivai i nizovi
Zadatak 1 - reenje
Posmatramo deklaraciju:
int a[]={1,0}
&a[0] a
&a[i] a+i
a[i] *(a+i)
a:
a:
a+1
a+2
p=a;
a:
a+3
5/34
Zadatak 1
Dodela vrednosti
6/34
p
}
7/34
8/34
Zadata 2 reenje
- Operator & dohvata adresu
operanda u memoriji
&a[4]
a:
Zadatak 2
for (p=&a[0], i=0; p+i<a+4; p++, i++)
printf("%d", *(p+i));
p:
&a[i] a+i
a[i] *(a+i)
Ispis: 0 1 2 3 4
za i==0:
a+4
a:
i: 0
p:
&a[0] a
a[0] *a
i: 1
Podsetnik:
*(p+i) = p[i]
p+i
a:
a+4
Ispis: 0 2
Programiranje 2 2009 ETF Beograd
9/34
Zadatak 2
for (p=a+4, i=0; i<=4; i++)
printf("%d", p[-i]);
p-0
p:
a:
i: 0
Oprez!
p-1
p:
i: 1
a:
Zadatak 3
10/34
Ispis: 4 3 2 1 0
Programiranje 2 2009 ETF Beograd
11/34
12/34
Zadatak 3 reenje
p++ p = p + sizeof(*p)
Rezultat je : 1000 + 4 = 1004
Odgovor: C
Programiranje 2 2009 ETF Beograd
Zadatak 4 - reenje
a:
13/34
#include <stdio.h>
#define NMAX 100
void main () {
int a[NMAX], *p, *q, n;
while (1) {
printf ("n? "); scanf ("%d", &n);
if (n<=0 || n>NMAX) break;
printf ("A? ");
for (p=a; p<a+n; p++) scanf ("%d", p);
for (p=a, q=a+n-1; p<q; p++, q--) {
int b = *p; *p = *q; *q = b;
}
printf ("A=");
for (p=a; p<a+n; p++) printf (" %d", *p);
}
}
Zadatak 4
q:
p:
14/34
15/34
16/34
void* malloc(vel)
vel predstavlja traenu veliinu memorije u bajtovima
void* calloc(n,vel)
n predstavlja broj elemenata niza
vel predstavlja veliinu jednog elementa
void main () {
int *a, *p, *q, n;
printf ("n? ");
scanf ("%d", &n);
18/34
while (n>0) {
a = calloc(n, sizeof(int));
if (a == NULL) {
printf("Neuspesna alokacija memorije!");
exit(1);
}
19/34
20/34
Zadatak 4
Zadatak 5
Date su sledee deklaracije:
int i, x;
int *a, *b;
a)a+=i;
____________________________________
b)a-=i;
____________________________________
c)a = i; ____________________________________
d)a *= i; ____________________________________
e)a = b; ____________________________________
f)a = b+i;____________________________________
g)a += b; ____________________________________
h)a -= b; ____________________________________
i)x = a>b; ___________________________________
printf ("A=");
for (p=a; p<a+n; p++) printf (" %d", *p);
free(a);
printf ("n? ");
scanf ("%d", &n);
}
}
Programiranje 2 2009 ETF Beograd
21/34
22/34
#include <stdio.h>
#include <stdlib.h>
void main() {
int **a, n, i, j;
printf("N="); scanf("%d", &n);
a = calloc(n, sizeof(int*));
for (i=0; i<n; i++) {
*(a+i)= calloc(n, sizeof(int));
for (j=0; j<n; j++)
*(*(a+i)+j) = rand()/((double)RAND_MAX + 1) * 10;
}
for (i=0; i<n; printf("\n"), i++)
for (j=0; j<n; j++) printf("%d ", *(*(a+i)+j));
for (i=n-1; i>=0; i--) printf("%d ", *(*(a+i)+n-1-i));
putchar('\n');
}
p:
*(p+0)+n-1
*(p+0)+0
...
p+0
...
p+1
p+2
...
...
p+m-2
p+m-1
23/34
...
...
24/34
p = calloc(m, sizeof(int*));
p je statiki alociran dvostruki pokaziva u koji e biti smetena adresa
niza pokazivaa
m je broj vrsta (redova) matrice
svaki pokaziva u alociranom nizu pokazivaa e ukazivati na jedan niz
elemenata koji e predstavljati vrste (redove) matrice
p mora biti dvostruki pokaziva, jer da bi se pristupilo jednom elementu
matrice (p[i][j]), mora se prvo odrediti adresa i-te vrste i pristupiti itom pokazivau u nizu pokazivaa, a zatim odrediti adresa j-tog
elementa u nizu elemenata i pristupiti tom elementu
p[i][j] *(*(p+i)+j)
Programiranje 2 2009 ETF Beograd
Zadatak 6 - reenje
25/34
Zadatak 6
26/34
Deo koda:
27/34
28/34
Zadatak 6
Izraz:
*(*(a+i)+n-1-i));
Za i = 3
*(a + 3) a[3]
*(*(a + 3) + 4 1 - 3) a[3][0]
Za i = 1
*(a + 1) a[1]
*(*(a + 1) + 4 1 - 1) a[1][2]
a[0]
->
a[1]
->
a[2]
->
10
11
12
a[3]
->
13
14
15
16
a[0]
->
a[1]
->
a[2]
->
10
11
12
a[3]
->
13
14
15
16
Zadatak 7 - reenje
29/34
=>
Zadatak 7
30/34
#include <stdio.h>
#include <stdlib.h>
void main () {
int **a, **b, m, n, i, j;
/* Ispisivanje rezultata: */
printf ("\nTransponovana matrica:\n");
for (i=0; i<n; i++){
for (j=0; j<m; j++) printf ("%5d", b[i][j]);
printf ("\n");
}
/* Unistavanje matrica: */
for (i=0; i<m; i++) free (a[i]); free (a);
for (i=0; i<n; i++) free (b[i]); free (b);
31/34
32/34
Zadatak 7
Zadatak 7
a = malloc (dim*sizeof(int*));
for (i=0; i<dim; i++) {
a[i] = malloc (dim*sizeof(int));
if (i<m) {
printf ("%2d. vrsta? ", i+1);
for (j=0; j<n; j++) scanf ("%d", &a[i][j]);
}
}
/* Obrazovanje transponovane matrice: */
for (i=1; i<dim; i++)
for (j=0; j<i; j++) {
t = a[i][j]; a[i][j] = a[j][i]; a[j][i] = t;
}
#include <stdio.h>
#include <stdlib.h>
void main () {
int **a, dim, m, n, i, j, t;
/* Citanje dimenzija matrice: */
printf ("\nBroj vrsta i kolona? ");
scanf ("%d%d", &m, &n);
33/34
34/34