[C] dualità puntatore-vettore

Messaggioda studente-studente » 11/07/2017, 09:42

Ciao, ho un dubbio riguardo la dualità tra puntatore e vettore.
Ho capito che il nome del vettore è il puntatore al primo elemento però:
perché la dimensione è un'informazione ridondante per un parametro formale? Lui sa che passo un vettore ma come fa a capire quando finisce?
Stesso dubbio lo riporto sulle matrici: ho capito che si ha l'organizzazione row major ma perché passo una sola dimensione? essa serve per capire la lunghezza (quante colonne) di una riga essendo tutte di seguito ma come fa a sapere quante righe ho? quanto è lungo sto vettore di puntatori?

Grazie in anticipo!
studente-studente
Junior Member
Junior Member
 
Messaggio: 197 di 472
Iscritto il: 13/07/2016, 21:43

Re: [C] dualità puntatore-vettore

Messaggioda apatriarca » 11/07/2017, 10:26

Puntatori e array si comportano in modo simile, ma differiscono in alcune situazioni particolari. Per prima cosa la posizione in memoria di un array non può essere modificata, ma è fissata quando viene dichiarato. Un array ha poi associata una dimensione, che il compilatore conosce durante la compilazione e viene restituita usando sizeof. Siccome la dimensione è qualcosa che il compilatore memorizza, ma che non corrisponde a nulla durante l'esecuzione, questa dimensione si perde quando l'array viene passato come argomento ad una funzione. Gli array vengono passate alle funzioni come puntatori. I due prototipi di funzioni nell'esempio sono insomma del tutto uguali:
Codice:
int test(int *arr);
int test(int arr[]);


Il motivo per cui è invece necessario passare una dimensione nel caso delle matrici risiede nel fatto di aver bisogno di conoscere la dimensione di una riga per poter sapere come accedere agli elementi. Per accedere insomma all'elemento 3 4 di una matrice il compilatore calcola insomma il valore 3*col + 4 dove col è il numero di colonne (la lunghezza di una riga) e lo somma alla posizione iniziale della matrice per accedere all'elemento. Sono un po' di fretta ma spero si sia capito.
apatriarca
Moderatore
Moderatore
 
Messaggio: 4728 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [C] dualità puntatore-vettore

Messaggioda studente-studente » 11/07/2017, 11:03

Aaah quindi lui sa dove finisce il vettore(anche passato come puntatore) perché il compilatore se lo memorizza per i fatti suoi, motivo per cui durante l'esecuzione non sfora o altro.. va bene! Chiarissimo! Grazie mille per la celerità apatriarca!!
studente-studente
Junior Member
Junior Member
 
Messaggio: 198 di 472
Iscritto il: 13/07/2016, 21:43

Re: [C] dualità puntatore-vettore

Messaggioda apatriarca » 11/07/2017, 11:10

No, quando lo passa ad una funzione la dimensione si perde perché non può sapere se alla funzione è stato passato un array o un puntatore..
apatriarca
Moderatore
Moderatore
 
Messaggio: 4729 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [C] dualità puntatore-vettore

Messaggioda studente-studente » 11/07/2017, 11:20

e allora come si ferma? se il vettore ha dimensione 10 chi vieta che durante l'esecuzione non si vada oltre 9?
studente-studente
Junior Member
Junior Member
 
Messaggio: 199 di 472
Iscritto il: 13/07/2016, 21:43

Re: [C] dualità puntatore-vettore

Messaggioda apatriarca » 11/07/2017, 11:25

Il C lo permette senza alcun errore di compilazione. E questo è stato causa di numerosi bug.
apatriarca
Moderatore
Moderatore
 
Messaggio: 4730 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [C] dualità puntatore-vettore

Messaggioda apatriarca » 11/07/2017, 11:32

Considera che lo standard definisce l'operatore usato per accedere agli elementi nel seguente modo:
Codice:
a[b] => *(a + b);

Questo significa che il seguente codice è valido in C..
Codice:
#include <stdio.h>

int main(void)
{
  int a[3] = {1, 2, 3};

  for (int i = 0; i < 3; ++i) {
    printf("%d\n", i[a]);
  }

  return 0;
}

Nota come ho scambiato i e a nell'accesso agli elementi..
apatriarca
Moderatore
Moderatore
 
Messaggio: 4731 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [C] dualità puntatore-vettore

Messaggioda studente-studente » 11/07/2017, 11:54

apatriarca ha scritto:Nota come ho scambiato i e a nell'accesso agli elementi..

Ma se i lo hai definito come intero, cosa sarebbe i[a]?

Ancora non capisco.. se definisco nel main un puntatore (che uso come vettore) e poi lo passo ad una funzione, nè main nè funzione sanno quanto è lungo questo vettore.. cioè io so che dentro la variabile puntatore ho l'indirizzo della prima cella del vettore, ma come fa il programma a capire che ha raggiunto l'ultima?

Codice:
#include <stdio.h>

void stampo(int *v);
int main (void){

int *vettore; //quanto mai sarà lungo il vettore?
int elemento, flag=1;

do{
   printf("Inserire elemento:\n");
   scanf("%d", &elemento);

   if(elemento==0)
      flag=0;
   else
      vettore++=elemento;

}while(flag);

stampo(vettore);
return 0;
}

void stampo(int *v){
for( ; ; )
   printf("%d", v++);

}


In questo codice nessuno sa la dimensione del vettore, allora nella funzione stampo dovrebbe andare fuori no? Senza sizeof nessuno saprà mai..
studente-studente
Junior Member
Junior Member
 
Messaggio: 200 di 472
Iscritto il: 13/07/2016, 21:43

Re: [C] dualità puntatore-vettore

Messaggioda apatriarca » 11/07/2017, 12:17

Hai dichiarato un puntatore a int, non in array statico nel main. E non è iniziassero per cui punta ad una locazione di memoria a caso. La funzione stampo riceve un puntatore e la dimensione è sconosciuta. Il ciclo andrà oltretutto avanti all'infinito (se non crashasse prima perché accedi a memoria protetta).
apatriarca
Moderatore
Moderatore
 
Messaggio: 4732 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite