/* Demonstrira vezu izmedju pokazivaca i nizova */

#include <stdio.h>

void print_array(int* pa, int n);

int main() {
  int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  int num_of_elements = sizeof(a)/sizeof(int);
  int* pa;

  /* Niz je isto sto i adresa njegovog prvog elementa */
  printf("Niz a : %p\n", a);
  printf("Adresa prvog elementa niza a (&a[0]) : %p\n", &a[0]);
	
  /* Moguce je dodeliti niz pokazivacu odgovarajuceg tipa */
  pa = a;
	
  printf("Pokazivac pa ukazuje na adresu : %p\n", pa);
	
  /* Nizu nije moguce dodeljivati vrednost
	 (nizove mozemo smatrati KONSTANTNIM pokazivacima na prvi element) */
  /* a = pa; */

  /* Niz je moguce koristiti kao pokazivac tj. vaze pravila pokazivacke aritmetike */
  printf("a + 3 = %p\n", a + 3);

  /* Vazi da je 
	 a + i =  &a[i]  
	 odnosno 
	 *(a + i) = a[i]
  */
  printf("&a[3] = %p\n", &a[3]);

  /* Identiteti
	 a + i =  &a[i]  
	 odnosno 
	 *(a + i) = a[i]
	 vazi i za pokazivace i za nizove 
  */
	
  /* Pokazivace je na osnovu prethodnog moguce indeksirati kao nizove */
  printf("pa[5] = %d\n", pa[5]);
  printf("*(pa + 5) = %d\n", *(pa+5));
	
	
  /* Medjutim, sizeof(pa) je samo velicina pokazivaca, a ne niza */
  printf("sizeof(a) = %d\n", sizeof(a));
  printf("sizeof(pa) = %d\n", sizeof(pa));
	
  /* Pozivamo funkciju za stampanje niza i saljemo joj niz */
  print_array(a, num_of_elements);
  /* Pozivamo funkciju za stampanje niza i saljemo joj pokazivac na pocetak niza */
  print_array(pa, num_of_elements);

  return 0;
}

/* Proslednjivanje niza u funkciju 
   	void print_array(int pa[], int n);
   je ekvivalentno prosledjivanju pokazivaca u funkciju 
   	void print_array(int* pa, int n);
   Izmedju ovih konstrukcija nema nikakve razlike.
*/
void print_array(int* pa, int n)
{
	int i;
	for (i = 0; i<n; i++)
		printf("%d ", pa[i]);
	putchar('\n');
}