Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    102

    [C] Passare matrice per riferimento o valore-Informazione

    Salve a tutti,
    leggendo il seguente codice:
    codice:
    #include <stdio.h>
    #define M 3
    
    typedef int matrix [M][M];
    
    void leggi(matrix);
    void stampa(matrix);
    
    int main()
    {
    	matrix m;
    	
    	printf("Leggi matrice %dx%d\n",M,M);
    	leggi(m);
    	puts("Matrice inserita");
    	stampa(m);
    
    }
    
    void leggi(matrix m)
    {
    	int i,j;
    	for(i=0;i<M;i++)
    	{
    		for(j=0;j<M;j++)
    			scanf("%d",&m[i][j]);
    	}
    }
    void stampa(matrix m)
    {
    	int i,j;
    	for(i=0;i<M;i++)
    	{
    		for(j=0;j<M;j++)
    			printf("%d\t",m[i][j]);
    		putchar('\n');
    	}
    }
    noterete che ho passato alle funzioni leggi e stampa, una matrice. In questo caso per valore.
    A questo punto, mi è sorto un dubbio: perchè i dati che vengono presi in input nella funzione leggi, vengono collocati nella matrice ( m ) definita nel main ?
    Io non passo l'indirizzo della matrice, giusto ?

  2. #2
    I vettori e le matrici sono passate sempre tramite puntatore per motivi strani (questioni di compatibilità addirittura con il B, mi pare).
    Lo standard infatti dice in proposito (§6.7.5.3 ¶7):
    A declaration of a parameter as ‘‘array of type’’ shall be adjusted to ‘‘qualified pointer to type’’, where the type qualifiers (if any) are those specified within the [ and ] of the array type derivation.
    ovvero: una dichiarazione del tipo:
    codice:
    void funzione(int arr[10]) // arr è un array di 10 int
    di fatto viene letta come
    codice:
    void funzione(int * arr) // arr è un puntatore ad int
    e quando viene richiamata l'array decade in un puntatore al suo primo elemento.
    Analogamente
    codice:
    void funzione(int arr[10][10]) // arr è un array di 10 array di 10 int
    diventa
    codice:
    void funzione(int (* arr)[10]) // arr è un puntatore ad un array di 10 int
    dove quella sintassi con le parentesi identifica un puntatore ad un array di 10 elementi (quando passi un array multidimensionale di fatto viene passato un puntatore alla sua prima riga).

    In ogni caso, se vuoi passare gli array per valore li devi incapsulare in una struct.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    102
    Originariamente inviato da MItaly
    I vettori e le matrici sono passate sempre tramite puntatore per motivi strani (questioni di compatibilità addirittura con il B, mi pare). Se le vuoi passare per valore le devi incapsulare ad esempio in una struct.
    Grazie mille !

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.