Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Vettori usati come funzioni.
Forum - C/C++ - Vettori usati come funzioni.

Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 19:12
Lunedì, 05/07/2010
Mi è sorto un dilemma. Sono convinto che questo programma stamperà sempre 0
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. void cc (int); // prototipo
  4.  
  5. int main (void) {
  6.         int i = 0; // dichiaro i uguale a 0
  7.         cc(i); // invoco la funzione cc passando come argomento il valore di i
  8.         printf("%d\n", i); // stampo i (0) !
  9.         getchar();
  10. }
  11.  
  12. void cc (int a) { //copia il valore di i all'interno della variabile a
  13.         a = 5; // modifico la variabile a e non la i
  14. }



Questo programma può essere modificato come segue:

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. void cc (int *); // prototipo
  4.  
  5. int main (void) {
  6.         int i = 0; // i = 0;
  7.         cc(&i); // invoco la funzione cc
  8.         printf("%d\n", i); //stampa i: 5 !
  9.         getchar();
  10. }
  11.  
  12. void cc (int *a) { // è un puntatore quindi la variabile i sarà modificata
  13.         *a = 5; // possiamo tranquillamente dire che i = 5
  14. }



Finito anche questo esempio, arriviamo al nocciolo della questione.

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. void cc (int []);
  4.  
  5. int main (void) {
  6.         int ii;
  7.         int i[5] = {0}; // inizializzo un vettore di 5 elementi tutto a 0
  8.         cc(i); // chiamo la funzione e passo come argomento il vettore i
  9.         for (ii = 0; ii < 5; ii++) {
  10.                 printf("%d ", i[ii]); // mi stamperà i valore inseriti nella funzione cc ?
  11.         }
  12.         printf("\n");
  13.         getchar();
  14. }
  15.  
  16. void cc (int a[]) {
  17.         int i = 0;
  18.         while (i < 5) {
  19.                 scanf("%d", &a[i]); // input valori
  20.                 i++;
  21.         }
  22. }


Adesso mi chiedo, è normale questo comportamento ? (vedere l'ultimo code commentato) Non è come se usassi i puntatori quando passo i vettori ? Spero di non essermi dilungato molto con gli esempi :hail:

Ultima modifica effettuata da Pitagora il 05/07/2010 alle 19:14
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 19:28
Lunedì, 05/07/2010
Hai scoperto una delle cose fondamentali del C: i vettori, in C, non esistono.

Quando passi un vettore ad una funzione, questo decade automaticamente a puntatore (non vengono copiati gli elementi, ma viene solo passato l'indirizzo di base), quindi puoi modificarne il contenuto.

Mi piace vedere che ci sei arrivato da solo, facendo esperimenti, continua così, però magari se avessi dato uno sguardo ad un libro ci C, l'avresti saputa questa cosa già dal capitolo 2... :D

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6381
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 19:33
Lunedì, 05/07/2010
Testo quotato

Postato originariamente da Pitagora:
Adesso mi chiedo, è normale questo comportamento ? ...  



In pratica, la variabile i la puoi passare per valore e per indirizzo, il vettore solo per indirizzo.

Ma come ti ha detto TheKaneB, queste cose si studiano sui libri, altrimenti non sai neanche se sono "bug" o comportamenti leciti del linguaggio ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 19:51
Lunedì, 05/07/2010
dal capitolo due, dai non esageriamo :_doubt: grazie ragazzi !

PM Quote