Passaggio di array a funzioni

Passaggio di array a funzioni

In questo articolo faremo alcuni esempi sul passaggio di array a funzioni.

Il passaggio di un array in C, come parametro di una funzione, avviene sempre per indirizzo, difatti non è possibile il passaggio di un array per valore.

Chi volesse inoltre consultare la lezione sugli array e puntatori lo può fare a questo link: array e puntatori.

Ricordiamo dunque che il nome di uno array è un puntatore costante.


Facciamo quindi alcuni esempi di prototipi di funzione, dove passiamo un array per indirizzo:

int f_max(int a[], int dim); //esempio di prototipo

possiamo scrivere anche: int f_max(int *a, int dim);

I due metodi sono infatti equivalenti.

Se definiamo una costante N, potremmo anche scrivere:

#define N 10

int f_max(int a[N], int dim); //esempio di prototipo


Esempio di passaggio di array a funzioni

Creiamo adesso un esempio completo a scopo didattico.

Quindi dichiariamo e definiamo due funzioni: f_max ed f_min, che calcolano rispettivamente l’elemento massimo e l’elemento minimo di un array.

Ricordiamo che possiamo fare a meno dei prototipi di funzione (dichiarazione) se le funzioni sono definite prima del main.

Consiglio anche di consultare la lezione sulle funzioni, se non avete ben chiaro questo concetto: le funzioni in C.

Ecco dunque il listato d’esempio sul passaggio di array a funzioni in C.

#include <stdio.h>

#define N 10

int f_max(int a[], int n); //prototipo di funzione
int f_min(int a[], int n); //prototipo di funzione

main(){
	int i, v[N], max, min;
        
        //inserimento elementi
	for (i<0;i<N;i++) {
		printf("inserisci elemento %d: ", i+1);
		scanf("%d", &v[i]);
		}
	
        //stampa elementi
	for (i<0;i<N;i++)
		printf("%d", v[i]);
		
	max=f_max(v,N); //invocazione della funzione f_max
	printf("\nil massimo e' %d", max); //stampa del massimo
	
	min=f_min(v,N); //invocazione della funzione f_min
	printf("\nil minimo e' %d", min); //stampa del minimo
}

int f_max(int a[], int n) { //definizione di funzione

	int i, max;
	max=a[0];
	
	for (i=0;i<n;i++) 
		if (a[i]>max)
			max=a[i];
	
	return max;		
}

int f_min(int a[], int n) { //definizione di funzione

	int i, min;
	min=a[0];
	
	for (i=0;i<n;i++) 
		if (a[i]<min)
			min=a[i];
	
	return min;		
}

Nel prossimo articolo ci eserciteremo ancora con altri esempi sul passaggio di array a funzioni.

Alcuni link utili

Realizzare un menù di scelta in C

Strutture complesse in C

Esercizio sulle struct in C

Typedef struct C

Somma elementi diagonale principale di una matrice

Come sommare gli elementi della cornice esterna

Come sommare due matrici

Matrice trasposta

Prodotto tra matrici

Ricerca elementi in una matrice

Quali metodi per inserire dati in una matrice

Tavola pitagorica in C

Array multidimensionali

Quick sort in C

Selection sort in C

Merge sort in C

Insertion Sort in C

Passaggio di parametri per indirizzo

Passaggio di parametri per indirizzo

In questa lezione parleremo del passaggio di parametri per indirizzo in C, che differisce da quello per valore in quanto all’atto della chiamata della funzione non viene allocata nessuna area di memoria per i parametri formali. Infatti essi fanno riferimento alla stessa area di memoria allocata per i parametri attuali.

Quindi introduciamo il concetto di passaggio dei parametri per indirizzo.

Cosa vuol dire passare un indirizzo ad una funzione?

Significa rendergli nota la locazione dell’oggetto corrispondente all’indirizzo. Quindi non viene trasmesso il valore dei parametri attuali ma l’indirizzo della cella di memoria assegnata ad essa.

Quali vantaggi comporta ciò?

In questo modo le istruzioni all’interno di una funzione possono modificare il contenuto della variabile il cui indirizzo è stato passato alla funzione.

Esempio di passaggio di parametri per indirizzo

Per capire meglio il concetto facciamo subito un esempio classico, ovvero la funzione che si occupa di scambiare il valore dei suoi parametri.

Creiamo un programma che scambia il contenuto delle due variabili x e y utilizzando una variabile temporanea temp che funziona da variabile di appoggio. Quindi esaminiamo l’esempio sotto:

#include <stdio.h>

void scambia(int a, int b) {
	int temp;
	
	temp=a;
	a=b;
	b=temp;
}

main() {
	int x=20, y=30;
	
	scambia(x,y);
	printf("x vale %d", x);
	printf("y vale %d", y);
}

Se eseguiamo il codice notiamo che il contenuto delle variabili non è stato scambiato. In quanto la chiamata alla funzione scambia(x,y) non produce nulla.

Perché? Perché lo scambio non ha alcun effetto sulle variabili x e y. Infatti i valori x e y sono copiati nei parametri formali a e b. E sono i valori dei parametri formali ad essere scambiati non i valori originali di x e y.

Quindi, per avere il risultato desiderato, la funzione scambia deve essere modificata in modo tale da ricevere gli indirizzi anziché i valori delle variabili.

Perciò modifichiamo la funzione passando gli indirizzi delle variabili.

#include <stdio.h>

void scambia(int *a, int *b) {
	int temp;
	
	temp=*a;
	*a=*b;
	*b=temp;
}

main ()
{
	int x=20, y=30;
	
	scambia(&x,&y);
	printf("\nx vale %d", x);
	printf("\ny vale %d", y);
}

Utilizzando int *a stiamo dichiarando a come variabile di tipo puntatore ad un intero.

Allo stesso modo per b.

L’invocazione della funzione scambia deve essere anche modificata, in modo da passare l’indirizzo delle variabili da scambiare scambia(&x,&y).


Passaggio di un array

In molti casi, non solo è necessario passare un array ma anche restituire una struttura dati più complessa che non sia una variabile int o char ad esempio. Quindi sfruttiamo la strategia spiegata anche per gli array.

Le stringhe, ovvero gli array di caratteri, possono essere dichiarate usando i puntatori.

Le funzioni di manipolazione stringa gestiscono le stringhe per mezzo di puntatori a caratteri.

Facciamo dunque un esempio a scopo didattico.

Quindi inizializziamo un array stringa char str[]=”Coding” e con un contatore i contiamo i caratteri della stringa, escluso il carattere terminatore (\0).

#include <stdio.h> 

int main ()
 {
   	char str[]="Coding";
   	char *p;
   	int i=0;
   
   	p=str;
	
	while(*p++)
		i++;
		
	printf("\nLa stringa e' lunga: %d caratteri", i);
	
   return 0 ;
 }

In questo esempio p memorizza l’indirizzo str[0], quindi *p contiene il valore di str[0], cioè C e così via.

Realizziamo poi lo stesso esempio utilizzando una funzione che conta il numero di caratteri a cui passeremo un array di char.

#include <stdio.h>

char str[]="Coding";

int strlen(char *p) {
	int i=0;
	
	while(*p++)
		i++;
		
	return i;
}

main ()
{
	printf("\nLa stringa e' lunga: %d caratteri", strlen(str));
}

Nella prossima lezione vedremo ancora degli esempi di passaggio di parametri per indirizzo.

Alcuni link utili

Realizzare un menù di scelta in C

Strutture complesse in C

Esercizio sulle struct in C

Typedef struct C

Media per riga e per colonna

Somma elementi diagonale principale di una matrice

Come sommare gli elementi della cornice esterna

Come sommare due matrici

Sommare dei numeri di una matrice

Matrice trasposta

Prodotto tra matrici

Ricerca elementi in una matrice

Inserire dati in una matrice

Tavola pitagorica in C

Array multidimensionali

Programma sui triangoli in C

Media dei numeri in un array

Array con numeri random

Quick sort in C

Selection sort in C

Merge sort in C

Insertion Sort in C