C, puntatori e array

di il
1 risposte

C, puntatori e array

Il seguente codice è un algoritmo che, dati due array allocati dinamicamente ne crea a sua volta un'altro che contiene solo e soltanto gli elementi in comune dei due vettori precedenti.

#include <stdio.h>
#include <stdlib.h>

void intersezioneArray (int *v, int m, int *w, int n, int **x, int *o);

int main ()
{
	int *A;
	int *B;
	int *c, l;
	int i, dA, dB;
	
	//Numero elementi per A
	printf("Quanti elementi per A?\n");
	scanf("%d", &dA);
	
	//Allocazione dinamica di A con malloc
	A = malloc(dA*sizeof(int));

	//Caricamento elementi array A
	for(i = 0; i < dA; i++)
	{
		printf("A[%d] = ", i);
		scanf("%d", &A[i]);
	}
	
	//Numero di elementi per B
	printf("Quanti elementi per B?\n");
	scanf("%d", &dB);
	
	//Allocazione dinamica di B con malloc
	B = malloc(dB*sizeof(int));
	
	//Caricamento elementi array B
	for(i = 0; i < dB; i++)
	{
		printf("B[%d] = ", i);
		scanf("%d", &B[i]);
	}
	
	intersezioneArray (A, dA, B, dB, &c, &l);
	
	printf ("Array intersezione:\n");
	
	for (i=0; i<l; i++)
		printf ("%d ", c[i]);
	
	printf ("\n");
	
	free (c);
	
	return 0;
}

void intersezioneArray (int *v, int m, int *w, int n, int **x, int *o)
{
	int *aux, *aux2;
	int elCom=0, i, j;
	
	if (m>n)
		aux = (int *)malloc (m*sizeof (int));
	else
		aux = (int *)malloc (n*sizeof (int));
	
	for (i=0; i<m; i++)
		for (j=0; j<n; j++)
			if (v[i]==w[j])
			{
				aux[elCom]=v[i];
				elCom++;
			}
			
	if (elCom==0)
	{
		*x=NULL;
		*o=0;
		return;
	}
	
	aux2=(int *)malloc (elCom*sizeof (int));
	for (i=0; i<elCom; i++)
		aux2[i]=aux[i];
	
	*x=aux2;
	*o=elCom;
	free (aux);
}
A, B e c sono tre array, i primi due sono quelli in ingresso e l'ultimo, c, è il vettore che contiene gli elementi in comune.
Vengono dichiarati tutti e tre come puntatori, ok.
Ma perché alla chiamata di funzione "intersezioneArray (A, dA, B, dB, &c, &l);" viene passato l'indirizzo di c e non anche quelli di A e B?
Poi, "void intersezioneArray (int *v, int m, int *w, int n, int **x, int *o)", il parametro formale di c, **x, perché è un puntatore a puntatore?
Mi aiutereste a fare chiarezza? Grazie.

1 Risposte

  • Re: C, puntatori e array

    Veramente viene passato sia l'indirizzo di A sia l'indirizzo di B. Inoltre viene passato l'indirizzo del puntatore a c (puntatore doppio).

    E il puntatore doppio serve a fare in modo che sia possibile modificare il valore del puntatore a c allocando il vettore all'interno della funzione.
Devi accedere o registrarti per scrivere nel forum
1 risposte