vous ne pouvez pas passer par référence en C mais vous pouvez utiliser des pointeurs comme alternative
Oui, c'est exact.
Pour aller un peu plus loin. Tout ce que vous passez comme argument aux fonctions c, n'est transmis que par des valeurs. Qu'il s'agisse de la valeur d'une variable ou de l'adresse de la variable.
Ce qui fait la différence, c'est ce que vous envoyez.
Lorsque nous passons par la valeur, nous passons la valeur de la variable à une fonction. Lorsque nous passons par référence, nous passons un alias de la variable à une fonction. Le langage C peut transmettre un pointeur à une fonction, mais il s'agit toujours d'une transmission par valeur. Il s'agit de copier la valeur du pointeur, l'adresse, dans la fonction.
-
Si vous envoyez la valeur d'une variable, alors seule la valeur sera reçue par la fonction, et la modifier n'affectera pas la valeur originale.
-
Si vous envoyez l'adresse d'une variable, seule la valeur (l'adresse dans ce cas) est envoyée, mais comme vous avez l'adresse d'une variable, elle peut être utilisée pour modifier la valeur d'origine.
A titre d'exemple, nous pouvons voir un peu de code C++ pour comprendre la différence réelle entre call-by-value et call-by-reference. Tiré de este site web.
// Program to sort two numbers using call by reference.
// Smallest number is output first.
#include <iostream>
using namespace std;
// Function prototype for call by reference
void swap(float &x, float &y);
int main()
{
float a, b;
cout << "Enter 2 numbers: " << endl;
cin >> a >> b;
if(a>b)
swap(a,b); // This looks just like a call-by-value, but in fact
// it's a call by reference (because of the "&" in the
// function prototype
// Variable a contains value of smallest number
cout << "Sorted numbers: ";
cout << a << " " << b << endl;
return 0;
}
// A function definition for call by reference
// The variables x and y will have their values changed.
void swap(float &x, float &y)
// Swaps x and y data of calling function
{
float temp;
temp = x;
x = y;
y = temp;
}
Dans cet exemple C++, variable de référence (qui n'est pas présent dans C) est utilisé. Pour citer este site web,
"Une référence est un alias, ou un nom alternatif à une variable existante..." ,
y
"La principale utilisation des références est de servir de paramètres formels de fonctions pour supporter le passage par référence..."
Cela diffère de l'utilisation de pointeurs en tant que paramètres de fonction car,
"Une variable pointeur (ou pointeur en abrégé) est fondamentalement la même que les autres variables, qui peuvent stocker un élément de données. Contrairement à une variable normale qui stocke une valeur (comme un int, un double, un char), un pointeur stocke une adresse mémoire."
Ainsi, lorsque l'on envoie une adresse et que l'on reçoit des pointeurs, on n'envoie que la valeur, mais lorsque l'on envoie/reçoit une variable de référence, on envoie un alias ou une référence.
MISE À JOUR : 11 novembre 2015
Un long débat a eu lieu au sein de l C Salle de discussion Après avoir lu les commentaires et les réponses à cette question, j'ai réalisé qu'il pouvait y avoir une autre façon de l'aborder, c'est-à-dire une autre perspective.
Voyons un peu de code C simple
int i;
int *p = &i;
*p = 123;
Dans ce scénario, on peut utiliser la terminologie suivante, La valeur de p est une référence à i . Donc, si c'est le cas, si nous envoyons le même pointeur ( int* p
) à une fonction, on peut affirmer que, puisque i
est envoyée à la fonction, ce qui permet de l'appeler passage par référence .
Il s'agit donc d'une question de terminologie et de façon d'envisager le scénario.
Je ne suis pas complètement en désaccord avec cet argument. Mais pour une personne qui suit à la lettre le livre et les règles, ce serait une erreur.
NOTE : Mise à jour inspirée par este chat.