Passer un argument par référence ou par pointeur en C++
-
Utilisez la notation
&variable
pour passer des arguments de fonction par référence en C++ -
Utilisez la notation
*variable
pour passer des arguments de fonction par référence en C++ -
Utilisez la notation
(&array_variable)[x][y]
pour passer un tableau 2D par référence en C++
Cet article explique plusieurs méthodes pour passer un argument par la référence vs passer par le pointeur en C++.
Utilisez la notation &variable
pour passer des arguments de fonction par référence en C++
La transmission d’arguments est la caractéristique la plus courante des fonctions pour fournir une interface flexible pour l’échange de données entre différents blocs de code. Chaque fois qu’une fonction est appelée, ses paramètres sont créés et initialisés par les arguments qui ont été passés. Généralement, deux méthodes sont différenciées pour le passage d’argument: passé par valeur et passé par référence, cette dernière faisant du paramètre un alias pour l’argument correspondant. Nous démontrons une fonction d’échange d’entiers de base dans l’exemple suivant, où les arguments sont passés par des références et la notation int &var
est utilisée. Au retour de la fonction swapIntegers
, les objets int
de la portée de la fonction main
sont modifiés.
#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;
}
Production:
a = 45 b = 35
Swapping a and b ...
a = 35 b = 45
Utilisez la notation *variable
pour passer des arguments de fonction par référence en C++
Un comportement similaire à l’exemple précédent peut être implémenté à l’aide de pointeurs. Notez qu’un pointeur est une adresse de l’objet, et il peut être déréférencé avec l’opérateur *
pour accéder à la valeur de l’objet. Passer les arguments à l’aide du pointeur signifie que nous pouvons accéder aux objets donnés à partir de la portée de la fonction et modifier leurs valeurs afin que l’état soit conservé après le retour. Notez que, pour passer des pointeurs vers la fonction, ils doivent être accédés à l’aide de l’opérateur 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;
}
Production:
a = 45 b = 35
Swapping a and b ...
a = 35 b = 45
Utilisez la notation (&array_variable)[x][y]
pour passer un tableau 2D par référence en C++
Parfois, il peut être pratique de transmettre une référence de tableau de style C bidimensionnel à la fonction, mais la notation est légèrement non intuitive et peut conduire à des résultats erronés. Si nous avons un tableau d’entiers avec les dimensions arbitraires SIZE
, il peut être référencé à partir du paramètre de fonction avec la notation suivante - int (&arr)[SIZE][SIZE]
. Attention, le fait de manquer la parenthèse ()
sera interprété comme le tableau de références aux objets int
et entraînera une erreur de compilation.
#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;
}
Production:
[ 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