Welcome to Software Development on Codidact!
Will you help us build our independent community of developers helping developers? We're small and trying to grow. We welcome questions about all aspects of software development, from design to code to QA and more. Got questions? Got answers? Got code you'd like someone to review? Please join us.
Comments on Are there references in C?
Parent
Are there references in C?
When reading posts at programming sites such as this one, I frequently encounter people saying things like:
"There is no pass-by-reference in C, everything is passed by value."
People claiming such tend to be of the C++ programmer variety and are used to the C++ syntax distinction between pointers int*
and references int&
, which doesn't exist in C. And the argument usually goes:
void func (int* x);
...
int* p = &data;
func(p); // here the pointer p is passed by value
And sure, there is no denying that the pointer in this example is passed by value.
Questions: Are there references in C? Is it possible to pass variables by reference in C?
Post
Yes there are references and pass-by-reference in C, though the language has no explicit syntax item called "reference" like C++. In a C context, it is irrelevant that C++ happens to have something called references, which are basically glorified, read-only pointers.
The general computer science term reference pre-dates C and C++ both. Therefore, saying "pass by reference" is perfectly acceptable in any computer science context. It is a broad and general term.
As explained in that Wikipedia link, it is analogous to indirect access, which is a term used in assembler on the low-level machine code layer. There, direct addressing means accessing a value directly from a given address, but indirect addressing means accessing it through a provided index register containing the address. These CPU core index registers are where C and C++ compilers prefer to store the higher level concepts of pointers and references. But there is no distinction between pointers and references in the machine code - it's all translated to raw addresses.
If we look at the formal definitions of terms in the current ISO 9899:2018 C standard, we find this at 6.2.5/20:
A pointer type may be derived from a function type or an object type, called the referenced type. A pointer type describes an object whose value provides a reference to an entity of the referenced type. A pointer type derived from the referenced type "T" is sometimes called “pointer to T”.
A pointer type is a so-called derived type, meaning that it is always based on one of the object types (like int
).
Given these formal definitions, then we can look at the code example in the question:
void func (int* x);
- The pointer type is
int*
, here represented by the variablex
, and it is passed by value. - The referenced type is
int
and an object of that type, allocated elsewhere, is passed by reference.
int* p = &data;
-
p
is a pointer type. -
data
is a complete object type, presumably of typeint
.
func(p);
-
p
is passed by value. -
data
is passed by reference.
1 comment thread