Un'introduzione alle funzioni C

Un'introduzione alle funzioni C
I lettori come te aiutano a sostenere MUO. Quando effettui un acquisto utilizzando i link sul nostro sito, potremmo guadagnare una commissione di affiliazione. Per saperne di più.

Potresti aver trattato la sintassi C di base, con semplici esempi, e ora ti stai chiedendo come creare programmi più grandi e reali. Per cominciare, ti consigliamo di organizzare il tuo codice in parti efficienti, con un minimo di ripetizioni. In C, come nella maggior parte dei linguaggi, la risposta ai tuoi problemi è la funzione.





MUO Video della giornata SCORRI PER CONTINUARE CON IL CONTENUTO

Creare e utilizzare funzioni in C è semplice e offre molti vantaggi. Le funzioni consentono di suddividere programmi complessi in parti più piccole. Forniscono la riusabilità, sia all'interno del programma originale, sia nelle librerie correlate o in altri programmi separati.





Per iniziare, dovrai conoscere le dichiarazioni di funzioni, i prototipi, i parametri e le istruzioni return.





Cosa sono le funzioni in C?

  Una schermata che mostra il codice in un linguaggio di programmazione

Nella programmazione C , una funzione è una sezione di codice con nome che fa qualcosa quando glielo chiedi. Aiuta a mantenere il codice organizzato e ti consente di utilizzare la stessa azione più volte senza ripeterti.

L’esempio più semplice è quello che hai già utilizzato: la funzione main(). La funzione main è particolarmente speciale perché funge da punto di ingresso principale per qualsiasi programma C. Puoi anche utilizzare le funzioni di libreria, che sono quelle che qualcun altro ha già scritto, oppure puoi scrivere le tue funzioni definite dall'utente.



Funzioni: dichiarazione, definizione e chiamata

Questi tre aspetti sono fondamentali per l'utilizzo delle funzioni.

Dichiarazione di funzione

Fornisce informazioni sul nome, sul tipo restituito e sui parametri di una funzione, consentendone l'utilizzo prima della sua definizione completa. Viene anche chiamato prototipo di funzione. Segue questa semplice sintassi:





 return_type function_name(parameters);

Dove:

  • tipo_ritorno è il tipo di dati del valore restituito dalla funzione. Può essere qualsiasi tipo di dati C valido o vuoto se la funzione non restituisce un valore.
  • nome_funzione è il nome che dai alla funzione. Lo utilizzerai per chiamare la funzione in seguito.
  • parametri è un elenco di parametri di input accettati dalla funzione, se presenti. Ogni parametro è costituito da un tipo di dati seguito da un nome di parametro separato da virgole.

Ad esempio, ecco una semplice dichiarazione di funzione:





 int add(int a, int b);

Definizione della funzione

Quando chiami una funzione, esegue il codice specificato nella sua definizione. Include il nome della funzione, il tipo restituito, l'elenco dei parametri e le istruzioni che ne definiscono il comportamento. Ecco la sintassi:

 return_type function_name(parameters) { 
    // Function body - code that defines what the function does
    // Return a value if applicable
    return value;
}

Analizziamo parti della sintassi:

Corpo della funzione : Questo è il blocco di codice racchiuso tra parentesi graffe {} . Contiene le istruzioni che definiscono cosa fa la funzione quando viene chiamata.

Dichiarazione di restituzione : se la funzione ha un tipo restituito diverso da vuoto , IL ritorno L'istruzione restituisce un valore al chiamante. Questo valore deve corrispondere al tipo restituito specificato.

Ecco un semplice esempio di definizione di funzione:

 int add(int a, int b) { 
    int sum = a + b;
    return sum;
}

Chiamata di funzione

Proprio come in cucina, potresti avere una ricetta (definizione della funzione) e alcuni ingredienti (argomenti), ma devi comunque seguire le istruzioni per ottenere un risultato. Una chiamata di funzione eseguirà la funzione con determinati argomenti; ecco la sintassi:

 return_type result = function_name(arguments);

argomenti : questi sono i valori o le espressioni che passi alla funzione come input. Separa ogni argomento con una virgola. Il numero, l'ordine e i tipi di dati degli argomenti devono corrispondere all'elenco dei parametri della funzione.

trova un vestito da una foto

risultato : se la funzione ha un tipo restituito diverso da vuoto , è possibile acquisire il valore restituito utilizzando una variabile del tipo di dati appropriato.

Ecco un esempio di chiamata di funzione:

 #include <stdio.h> 

// Function prototype
int add(int a, int b);

int main() {
    int x = 5, y = 3;

    // Call the function and store the result in 'sum'
    int sum = add(x, y);
    printf("The sum of %d and %d is %d\n", x, y, sum);
    return 0;
}

// Function definition
int add(int a, int b) {
    return a + b;
}

Seguendo questi tre passaggi (dichiarare la funzione, fornire la sua implementazione e chiamarla con argomenti appropriati) è possibile utilizzare in modo efficace le funzioni per eseguire varie attività nel programma.

Parametri di funzione e valori restituiti

I parametri sono variabili dichiarate nella dichiarazione o definizione della funzione che fungono da segnaposto per i valori passati alla funzione quando viene chiamata. Consentono di passare i dati alla funzione, consentendole di lavorare e manipolare tali dati. I valori restituiti sono i valori che una funzione produce e invia al chiamante.

Esistono due metodi per passare i parametri.

Passare per valore

Con questo approccio, una chiamata di funzione copia il valore dell'argomento effettivo nel parametro della funzione. Le modifiche apportate al parametro all'interno della funzione non influiscono sull'argomento originale.

Per esempio:

 #include <stdio.h> 

int square(int num) {
    num = num * num;
    return num;
}

int main() {
    int x = 5;
    int y = square(x);

    // Output: x and y after function call: 5 25
    printf("x and y after function call: %d %d\n", x, y);

    return 0;
}
  • La funzione quadrata accetta un parametro intero, nessuno .
  • La funzione quadrato calcola il quadrato di num, ne aggiorna il valore e restituisce questo nuovo valore.
  • La funzione main dichiara una variabile intera, X e gli assegna il valore 5.
  • Quindi chiama la funzione quadrata, passandole il valore di x. Assegna il risultato a una seconda variabile, E .
  • Dopo la chiamata alla funzione, main stampa i valori di x e y. Il valore x rimane lo stesso perché la modifica del parametro num all'interno del quadrato non influisce sulla x originale.

Passa per riferimento

Utilizzando questo approccio, si passa l'indirizzo di memoria (puntatore) di un valore a una funzione. Le modifiche apportate al parametro all'interno della funzione influiscono sul valore originale all'esterno di essa.

I puntatori, compreso il loro utilizzo come parametri, sono uno degli aspetti di C che lo rendono diverso da un linguaggio come Python .

 #include <stdio.h> 

void square(int *num) {
    *num = *num * *num;
}

int main() {
    int x = 5;
    square(&x);

    // Output: x after function call: 25
    printf("x after function call: %d\n", x);
    return 0;
}
  • IL piazza la funzione accetta un puntatore intero ( intero * ) parametro, nessuno . Non restituisce un valore.
  • La funzione quadrato calcola il quadrato del valore che nessuno contiene e aggiorna quel valore utilizzando l'operatore di dereferenza del puntatore, * .
  • IL principale la funzione dichiara una variabile intera, X , e gli assegna il valore 5 .
  • Quindi chiama il piazza funzione con un puntatore a X utilizzando l'indirizzo dell'operatore: &X .
  • Dopo la chiamata alla funzione, main stampa il valore di X , che è adesso 25 dalle modifiche a *nessuno dentro il piazza la funzione influisce sull'originale X .

In sintesi, la differenza fondamentale tra i due metodi è il modo in cui le modifiche al parametro all'interno della funzione influiscono sul valore originale all'esterno di essa. Passa per valore crea una copia, mentre passa per riferimento (puntatore) consente la manipolazione diretta del valore originale.