Communities

Writing
Writing
Codidact Meta
Codidact Meta
The Great Outdoors
The Great Outdoors
Photography & Video
Photography & Video
Scientific Speculation
Scientific Speculation
Cooking
Cooking
Electrical Engineering
Electrical Engineering
Judaism
Judaism
Languages & Linguistics
Languages & Linguistics
Software Development
Software Development
Mathematics
Mathematics
Christianity
Christianity
Code Golf
Code Golf
Music
Music
Physics
Physics
Linux Systems
Linux Systems
Power Users
Power Users
Tabletop RPGs
Tabletop RPGs
Community Proposals
Community Proposals
tag:snake search within a tag
answers:0 unanswered questions
user:xxxx search by author id
score:0.5 posts with 0.5+ score
"snake oil" exact phrase
votes:4 posts with 4+ votes
created:<1w created < 1 week ago
post_type:xxxx type of post
Search help
Notifications
Mark all as read See all your notifications »
Q&A

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.

Post History

60%
+7 −4
Q&A Are there references in C?

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...

posted 2y ago by Lundin‭  ·  edited 2y ago by Lundin‭

Answer
#3: Post edited by user avatar Lundin‭ · 2022-01-27T14:47:55Z (about 2 years ago)
  • 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](https://en.wikipedia.org/wiki/Reference_(computer_science)) pre-dates C and C++ both. 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.
  • Therefore, saying "pass by reference" is perfectly acceptable in any computer science context. It is a broad and general term.
  • ---
  • 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 variable `x`, 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 type `int`.
  • `func(p);`
  • - `p` is passed by value.
  • - `data` is passed by reference.
  • 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](https://en.wikipedia.org/wiki/Reference_(computer_science)) 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 variable `x`, 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 type `int`.
  • `func(p);`
  • - `p` is passed by value.
  • - `data` is passed by reference.
#2: Post edited by user avatar Lundin‭ · 2022-01-27T14:38:36Z (about 2 years ago)
  • Yes there are references and pass-by-references 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](https://en.wikipedia.org/wiki/Reference_(computer_science)) pre-dates C and C++ both. 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.
  • Therefore, saying "pass by reference" is perfectly acceptable in any computer science context. It is a broad and general term.
  • ---
  • 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 variable `x`, 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 type `int`.
  • `func(p);`
  • - `p` is passed by value.
  • - `data` is passed by reference.
  • 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](https://en.wikipedia.org/wiki/Reference_(computer_science)) pre-dates C and C++ both. 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.
  • Therefore, saying "pass by reference" is perfectly acceptable in any computer science context. It is a broad and general term.
  • ---
  • 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 variable `x`, 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 type `int`.
  • `func(p);`
  • - `p` is passed by value.
  • - `data` is passed by reference.
#1: Initial revision by user avatar Lundin‭ · 2022-01-27T14:37:57Z (about 2 years ago)
Yes there are references and pass-by-references 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](https://en.wikipedia.org/wiki/Reference_(computer_science)) pre-dates C and C++ both. 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.

Therefore, saying "pass by reference" is perfectly acceptable in any computer science context. It is a broad and general term.

---

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 variable `x`, 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 type `int`.

`func(p);`
- `p` is passed by value.
- `data` is passed by reference.