Vedo che ancora hai un po' di confusione ...

Intanto il codice corretto

codice:
#include <stdio.h>

#define MAX 2   // E' meglio utilizzare il maiuscolo per le costanti

typedef struct
{
  char nome[30];
  char cognome[30];
} persona;

persona persone[MAX];

// il nome usato per l'argomento non deve essere uguale a quello
// della variabile passata ... qui ho usato arg
void stampa_nome(int arg);
void prendi_nome(int arg);
void stampa_cognome(int arg);
void prendi_cognome(int arg);

void main()
{
  int i;  // questa variabile puo' essere dichiara nel main

  for (i=0; i<MAX; ++i)
  {
    // quando richiami le funzioni, devi passare gli argomenti attuali
    // tramite variabili e/o espressioni compatibili ...
    prendi_nome(i);
    prendi_cognome(i);
    stampa_nome(i);
    stampa_cognome(i);
  }
}

// il nome dell'argomento non deve essere uguale 
// a quello della variabile usata per passare il valore
// Ho usato arg ed e' solo importante che arg sia
// usato all'interno della funzione ... il compilatore
// provvedera' a copiare il valore di i in quello di arg
void stampa_nome(int arg)
{
  printf("il nome utente è: %s\n", persone[arg].nome);
}

void prendi_nome(int arg)
{
  printf("inserisci nome utente\n");
  scanf ("%s", persone[arg].nome);
}

void stampa_cognome(int arg)
{
  printf("il cognome utente è: %s\n", persone[arg].cognome);
}

void prendi_cognome(int arg)
{
  printf("inserisci cognome utente\n");
  scanf ("%s", persone[arg].cognome);
}
... leggi anche le note accanto alle righe ...

E leggi un buon libro per le basi di C ...