GNU/Linux >> Linux Esercitazione >  >> Linux

Esercitazione sulla programmazione C Linux Parte 8 - Chiamata per valore Vs Chiamata per puntatore/indirizzo

Nella nostra prima parte di questa serie di tutorial in corso, abbiamo discusso brevemente delle funzioni, inclusi la loro dichiarazione e il corpo. Ciò di cui non abbiamo discusso in quel momento erano i molteplici modi in cui vengono chiamate le funzioni. Qui, in questo tutorial, discuteremo rapidamente dei modi che esistono.

Nel linguaggio C, puoi chiamare una funzione in un paio di modi:chiama per valore e chiama per puntatore o indirizzo. Discutiamo entrambi questi concetti con alcuni esempi di facile comprensione.

Diciamo che vuoi scrivere un programma che scambia due valori. Ecco come puoi farlo:

#include <stdio.h>

int main()
{
int a=0, b=0, c=0;

printf("Enter two integer values\n");

scanf("%d %d",&a,&b);

printf("Entered values are: %d and %d", a,b);

c = a;
a = b;
b = c;

printf("\nSwapped values are: %d and %d", a,b);



return 0;
}

Ecco l'output di questo codice con i valori inseriti come 5 e 9:

Enter two integer values
5 9

Entered values are: 5 and 9
Swapped values are: 9 and 5

Ora, supponiamo che il requisito sia avere una funzione separata - diciamo 'swap' - che fa tutto il lavoro relativo allo scambio e può essere chiamata ogni volta che il programmatore vuole scambiare due valori. Di seguito è riportato il codice che esegue questa operazione:

#include <stdio.h>

void swap (int val1, int val2)
{
int temp = 0;

temp = val1;
val1 = val2;
val2 = temp;

printf("\nSwapped values are: %d and %d", val1,val2);

}

int main()
{
int a=0, b=0;

printf("Enter two integer values\n");

scanf("%d %d",&a,&b);

printf("Entered values are: %d and %d", a,b);

swap(a,b);

return 0;
}

Quindi ecco qua. È stata creata una funzione separata denominata 'swap' che riceve due valori (originariamente immessi dall'utente e acquisiti nella funzione 'main') come argomenti, quindi li scambia e stampa l'output.

Il modo in cui 'swap' è stato chiamato qui è noto come 'call by value'. Il motivo è che, quando viene effettuata la chiamata, solo i valori detenuti da 'a' e 'b' vengono passati alla funzione 'swap' come argomenti. Questi valori vengono ricevuti dagli argomenti 'val1' e 'val2', e sono queste variabili su cui viene eseguito il processo di scambio.

Ciò significa che le variabili 'a' e 'b' nella funzione 'principale' continuano a mantenere i valori originali anche dopo che l'operazione di scambio è stata eseguita. Ma cosa succede se il requisito è avere i valori di 'a' e 'b' scambiati dopo aver chiamato la funzione 'swap'? Bene, è qui che entra in gioco il metodo "chiamata per puntatore/indirizzo".

Quindi fondamentalmente quello che facciamo qui è passare l'indirizzo delle variabili (come 'a' e 'b' nel nostro caso) come argomenti. La funzione che viene chiamata ('swap' in questo caso) è attrezzata per ricevere indirizzi come argomenti e quindi il processo di scambio viene eseguito sui valori mantenuti a questi indirizzi, il che significa effettivamente valori di variabili originali ('a' e 'b' qui ) vengono scambiati.

Ora, nel paragrafo precedente, abbiamo detto che la funzione "è attrezzata per ricevere indirizzi come argomenti". Bene, per "equipaggiato" intendiamo che ha un tipo speciale di argomenti che possono ricevere indirizzi. Questi argomenti sono variabili di tipo "puntatore". Discuteremo i "puntatori" in dettaglio in un prossimo tutorial, ma per ora tieni presente che le variabili del puntatore memorizzano gli indirizzi di memoria come valori.

Ecco come viene dichiarato/definito un puntatore a un numero intero:

int *x;

Quindi, in pratica, x è una variabile puntatore che può essere utilizzata per memorizzare l'indirizzo di memoria di una variabile intera. Supponiamo che 'i' sia una variabile intera, quindi ecco come puoi fare in modo che 'x' memorizzi l'indirizzo di 'i':

x = &i;

E ogni volta che vuoi accedere al valore di 'i' tramite 'x', scrivi '*x'. Ad esempio, ecco come puoi modificare il valore di 'i' in, diciamo, 10:

*x = 10;

Quindi, con tutto questo in mente, ecco come puoi chiamare "swap" usando il metodo di chiamata per indirizzo o puntatore:

#include <stdio.h>

void swap (int *val1, int *val2)
{
int temp = 0;

temp = *val1;
*val1 = *val2;
*val2 = temp;

}

int main()
{
int a=0, b=0, c=0;

printf("Enter two integer values\n");

scanf("%d %d",&a,&b);

printf("Entered values are: %d and %d", a,b);

swap(&a,&b);

printf("\nSwapped values are: %d and %d", a,b);


return 0;
}

Quindi questa volta, invece di passare i valori di 'a' e 'b' come argomenti, abbiamo passato gli indirizzi di queste variabili. Nella funzione 'swap', gli indirizzi vengono ricevuti in due variabili puntatore ('val1' e 'val2'). E usando le due variabili puntatore, la logica scambia direttamente i valori di 'a' e 'b'.

Ecco l'output:

Enter two integer values 
6 8
Entered values are: 6 and 8
Swapped values are: 8 and 6

Questo articolo dovrebbe averti fornito almeno un'idea di base di quali sono le modalità di chiamata delle funzioni "chiamata per valore" e "chiamata per indirizzo/puntatore" e quando possono essere utilizzate. Prova gli esempi che abbiamo elencato qui e facci sapere nei commenti qui sotto se hai dubbi o domande.


Linux
  1. C Tutorial di programmazione Parte 5 - Variabili di carattere

  2. Esercitazione sulla programmazione C Linux Parte 10 - Ambiti variabili

  3. Esercitazione sulla programmazione C Linux Parte 9:Stringhe

  4. Esercitazione sulla programmazione C Linux Parte 8 - Chiamata per valore Vs Chiamata per puntatore/indirizzo

  5. Esercitazione sulla programmazione C Linux Parte 8 - Chiamata per valore Vs Chiamata per puntatore/indirizzo

Come trovare l'indirizzo IP in Kali Linux

Esempi di comandi curl Linux – Parte 2

Esempi di comandi curl Linux – Parte 1

Tutto è un file in Linux – Parte 2

Come trovare l'indirizzo IP in Linux

Come modificare l'indirizzo IP su Linux