Passa argomento per riferimento e per puntatore in C++
-
Usa la notazione
& variabile
per passare gli argomenti della funzione per riferimento in C++ -
Usa la notazione
*variabile
per passare gli argomenti della funzione per riferimento in C++ -
Usa la notazione
(&array_variable)[x][y]
per passare array 2D per riferimento in C++
Questo articolo spiegherà diversi metodi per passare un argomento dal riferimento e passare dal puntatore in C++.
Usa la notazione & variabile
per passare gli argomenti della funzione per riferimento in C++
Il passaggio di argomenti è la caratteristica più comune delle funzioni per fornire un’interfaccia flessibile per lo scambio di dati tra diversi blocchi di codice. Ogni volta che viene richiamata una funzione, i suoi parametri vengono creati e inizializzati dagli argomenti passati. Generalmente, due metodi sono differenziati per il passaggio degli argomenti: passato per valore e passato per riferimento, l’ultimo dei quali fa sì che il parametro sia un alias per l’argomento corrispondente. Dimostriamo una funzione di scambio di interi di base nel seguente esempio, dove gli argomenti vengono passati dai riferimenti e viene utilizzata la notazione int &var
. Quando la funzione swapIntegers
ritorna, gli oggetti int
nell’ambito della funzione main
vengono modificati.
#include <iostream>
using std::cout;
using std::endl;
void swapIntegers(int& x, int& y) {
int z = x;
x = y;
y = z;
}
int main() {
int a = 45, b = 35;
cout << "a = " << a << " b = " << b << "\n";
cout << "Swapping a and b ...\n";
swapIntegers(a, b);
cout << "a = " << a << " b = " << b << "\n";
return EXIT_SUCCESS;
}
Produzione:
a = 45 b = 35
Swapping a and b ...
a = 35 b = 45
Usa la notazione *variabile
per passare gli argomenti della funzione per riferimento in C++
Un comportamento simile all’esempio precedente può essere implementato utilizzando i puntatori. Notare che un puntatore è un indirizzo dell’oggetto e può essere dereferenziato con l’operatore *
per accedere al valore dell’oggetto. Passare gli argomenti utilizzando il puntatore significa che possiamo accedere agli oggetti dati dall’ambito della funzione e modificare i loro valori in modo che lo stato venga preservato dopo il ritorno. Si noti che, per passare i puntatori alla funzione, è necessario accedervi utilizzando l’operatore address-of (&
).
#include <iomanip>
#include <iostream>
using std::cout;
using std::endl;
using std::setw;
void swapIntegers2(int* x, int* y) {
int z = *x;
*x = *y;
*y = z;
}
int main() {
int a = 45, b = 35;
cout << "a = " << a << " b = " << b << "\n";
cout << "Swapping a and b ...\n";
swapIntegers2(&a, &b);
cout << "a = " << a << " b = " << b << "\n";
return EXIT_SUCCESS;
}
Produzione:
a = 45 b = 35
Swapping a and b ...
a = 35 b = 45
Usa la notazione (&array_variable)[x][y]
per passare array 2D per riferimento in C++
A volte può essere utile passare un riferimento ad array bidimensionale in stile C alla funzione, ma la notazione è leggermente non intuitiva e potrebbe portare a risultati errati. Se abbiamo un array di numeri interi con le dimensioni arbitrarie SIZE
, può essere referenziato dal parametro della funzione con la seguente notazione - int (&arr)[SIZE][SIZE]
. Ricorda che, la mancanza della parentesi ()
verrà interpretata come l’array di riferimenti a oggetti int
e darà luogo a un errore di compilazione.
#include <iomanip>
#include <iostream>
using std::cout;
using std::endl;
using std::setw;
void MultiplyArrayByTwoV2(int (&arr)[SIZE][SIZE]) {
for (auto& i : arr) {
for (int& j : i) j *= 2;
}
}
void printArray(int (&arr)[SIZE][SIZE]) {
for (auto& i : arr) {
cout << " [ ";
for (int j : i) {
cout << setw(2) << j << ", ";
}
cout << "]" << endl;
}
}
constexpr int SIZE = 4;
int main() {
int array_2d[SIZE][SIZE] = {
{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}};
MultiplyArrayByTwoV2(array_2d);
printArray(array_2d);
return EXIT_SUCCESS;
}
Produzione:
[ 2, 4, 6, 8, ]
[ 10, 12, 14, 16, ]
[ 18, 20, 22, 24, ]
[ 26, 28, 30, 32, ]
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook