Referencing means taking the address of an existing variable (using &) to set a pointer variable. In order to be valid, a pointer has to be set to the address of a variable of the same type as the pointer, without the asterisk:

Copyint  c1;
int* p1;
c1 = 5;
p1 = &c1;
//p1 references c1

Dereferencing a pointer means using the * operator (asterisk character) to retrieve the value from the memory address that is pointed by the pointer: NOTE: The value stored at the address of the pointer must be a value OF THE SAME TYPE as the type of variable the pointer "points" to, but there is no guarantee this is the case unless the pointer was set correctly. The type of variable the pointer points to is the type less the outermost asterisk.

Copyint n1;
n1 = *p1;

Invalid dereferencing may or may not cause crashes:

  • Dereferencing an uninitialized pointer can cause a crash
  • Dereferencing with an invalid type cast will have the potential to cause a crash.
  • Dereferencing a pointer to a variable that was dynamically allocated and was subsequently de-allocated can cause a crash
  • Dereferencing a pointer to a variable that has since gone out of scope can also cause a crash.

Invalid referencing is more likely to cause compiler errors than crashes, but it's not a good idea to rely on the compiler for this.

References:

http://www.codingunit.com/cplusplus-tutorial-pointers-reference-and-dereference-operators

Copy& is the reference operator and can be read as “address of”.
* is the dereference operator and can be read as “value pointed by”.

http://www.cplusplus.com/doc/tutorial/pointers/

Copy& is the reference operator    
* is the dereference operator

http://en.wikipedia.org/wiki/Dereference_operator

CopyThe dereference operator * is also called the indirection operator.
Answer from A B on Stack Overflow
Top answer
1 of 8
127

Referencing means taking the address of an existing variable (using &) to set a pointer variable. In order to be valid, a pointer has to be set to the address of a variable of the same type as the pointer, without the asterisk:

Copyint  c1;
int* p1;
c1 = 5;
p1 = &c1;
//p1 references c1

Dereferencing a pointer means using the * operator (asterisk character) to retrieve the value from the memory address that is pointed by the pointer: NOTE: The value stored at the address of the pointer must be a value OF THE SAME TYPE as the type of variable the pointer "points" to, but there is no guarantee this is the case unless the pointer was set correctly. The type of variable the pointer points to is the type less the outermost asterisk.

Copyint n1;
n1 = *p1;

Invalid dereferencing may or may not cause crashes:

  • Dereferencing an uninitialized pointer can cause a crash
  • Dereferencing with an invalid type cast will have the potential to cause a crash.
  • Dereferencing a pointer to a variable that was dynamically allocated and was subsequently de-allocated can cause a crash
  • Dereferencing a pointer to a variable that has since gone out of scope can also cause a crash.

Invalid referencing is more likely to cause compiler errors than crashes, but it's not a good idea to rely on the compiler for this.

References:

http://www.codingunit.com/cplusplus-tutorial-pointers-reference-and-dereference-operators

Copy& is the reference operator and can be read as “address of”.
* is the dereference operator and can be read as “value pointed by”.

http://www.cplusplus.com/doc/tutorial/pointers/

Copy& is the reference operator    
* is the dereference operator

http://en.wikipedia.org/wiki/Dereference_operator

CopyThe dereference operator * is also called the indirection operator.
2 of 8
27

I've always heard them used in the opposite sense:

  • & is the reference operator -- it gives you a reference (pointer) to some object

  • * is the dereference operator -- it takes a reference (pointer) and gives you back the referred to object;

🌐
GeeksforGeeks
geeksforgeeks.org › c++ › dereference-pointer-in-c
Dereference Pointer in C - GeeksforGeeks
One is to declare a pointer variable and the other is dereference operator. When we dereference a pointer, we deal with the actual data stored in the memory location it points to.
Published   2 weeks ago
Discussions

Reference vs dereference pointers in arguments C++/C - Software Engineering Stack Exchange
The most important difference between references and pointers is that you cannot free an object through a reference while it is possible to do it through a pointer. Thus, selecting the reference type instead of the pointer type for an argument a in a method of an object b advertises that ownership of a is not transferred to b. (The common belief, that it is not possible to pass a dereferenced ... More on softwareengineering.stackexchange.com
🌐 softwareengineering.stackexchange.com
October 20, 2013
c - Pointers, dereferencing and referencing - Stack Overflow
What are you trying to determine here by using *&*&? And why would it be a surprise what %p prints versus %s prints if you read the documentation for these format specifiers? And do you understand what & and * mean in this context? ... %p expects a pointer, and prints the value of the pointer (i.e. More on stackoverflow.com
🌐 stackoverflow.com
What does 'dereferencing' a pointer mean in C/C++? - Stack Overflow
A pointer is a "reference" to a value.. much like a library call number is a reference to a book. "Dereferencing" the call number is physically going through and retrieving that book. More on stackoverflow.com
🌐 stackoverflow.com
ELI5 (Explain like I'm five): Pointers and dereferencing in C, please!
http://www.reddit.com/r/learnprogramming/comments/k4lgc/can_someone_explain_pointers_in_c_to_me_like_im_10/ http://www.reddit.com/r/learnprogramming/comments/szt3y/what_is_the_primary_difference_between_a_pointer/ http://www.reddit.com/r/learnprogramming/comments/1iezes/c_pointers_what_are_the_common_misconceptions/ http://www.reddit.com/r/learnprogramming/comments/15sex9/c_question_about_pointers_concepts/ http://www.reddit.com/r/learnprogramming/comments/14flxg/whats_the_best_way_to_understand_pointers_in_c/ http://www.reddit.com/r/learnprogramming/comments/1iik3e/c_two_or_so_questions_about_the_nature_of_pointers/ http://www.reddit.com/r/learnprogramming/comments/kzbn6/whats_the_point_of_pointers/ http://www.reddit.com/r/learnprogramming/comments/1bjo8n/c_issues_with_structures_and_double_pointers/ http://www.reddit.com/r/learnprogramming/comments/18n3pr/c_how_to_allocate_memory_to_a_pointer_using_the/ Etc... I've used the "search" function here; I hope that's simple enough. ;) More on reddit.com
🌐 r/learnprogramming
3
0
July 24, 2013
🌐
Reddit
reddit.com › r/c_programming › pointers, structs and dereferencing question
r/C_Programming on Reddit: Pointers, structs and dereferencing question
March 31, 2024 -

So ive written in C for a few years on and off, im writing a plugin system currently and have to work with pointers much more with this. The question is when and why should you use "->" or "." When using structs?

If im not mistaken, "*" is for dereferencing? Idk what that means, please explain.

Also "&" is for referencing an actual memory address, if not please explain. I am really confused on when, why and where you would use these?

TL;DR

"*"

"&"

. vs ->

Where, when, and why?

Please help me understand

🌐
Medium
medium.com › @adebanjoemmanuel01 › exploring-pointers-in-c-a-beginners-guide-827fe158efe6
Pointers in C, Alx, Pointer dereferencing | Medium
June 2, 2024 - To dereference a pointer all we need to do is *name_of_pointer after the pointer has been declared and assigned to point to a variable. So, adding an asterisk (*) to the name of the pointer after the declaration and assignment helps us to ...
🌐
Emory
cs.emory.edu › ~cheung › Courses › 561 › Syllabus › 3-C › ref-deref.html
The reference (&) and dereference (*) operators
The reference operator & can be used to pass the address of the actual parameter · The dereference operator * can be used to obtain the value stored at any given address
🌐
TutorialsPoint
tutorialspoint.com › cprogramming › c_dereference_pointer.htm
Dereference Pointer in C
You get the value of b (which is ... and the dereferenced value from c (which is the address of a) b: 6422036 Pointer to 'b' is 'c': 6422024 Value at 'b': 6422036 · Since "c" is a double pointer here, the first asterisk in its declaration points to "b" and the second asterisk in turn points to "a". We can use the double reference pointer to ...
Top answer
1 of 6
18

Most compilers will implement references as pointers. So the deep answer to your question is that there will be absolutely no difference in terms of performance between the two. (Doesn't change aliasing analysis either as far as I know.)

If you want to be 100% sure of that statement, inspect your compiler's output.

struct Small {
    int s;
};
void foo(Small* s)
{
    s->s = 1;
}
void bar(Small& s)
{
    s.s = 1;
}

Compiled with clang++ -O2, saving the assembly:

_Z3fooP5Small:                          # @_Z3fooP5Small
    .cfi_startproc
# BB#0:
    movl    $1, (%rdi)
    ret
_Z3barR5Small:                          # @_Z3barR5Small
    .cfi_startproc
# BB#0:
    movl    $1, (%rdi)
    ret

You can try that with a large struct or an enormously complex struct - doesn't matter, all you're passing in to the function is a pointer.

That being said, there are semantic differences between the two. The most important one being that, as long as your program is free of undefined behavior, the overload that takes a reference is guaranteed to get a reference to a valid, live object. The pointer overload isn't.

Also assigning to s in these two examples has completely different meanings. It would replace the pointer in the first function (i.e. whatever it pointed to remains unchanged, but becomes unreachable from within that function; caller unaffected by the assignment).
In the second, it would call the appropriate assignment operator en the object passed in (effect visible from the caller).

So your choice shouldn't be made on a potential performance difference (there will generally be none), but on semantics. What you need the function to be able to do, and how you should be able to call it, will dictate what overload(s) you need to provide.

2 of 6
10

The main semantic differerence between int* and int& is that the former allows passing of NULL or uninitialized values, and the latter does not. So the implementation of a function using pointers should look like this:

 void sth(int* a)
 {
     if(a==NULL)
     {
         // handle NULL case
     }
     else
     {
         // do something with *a
     }
 }

When using references, you can omit that special NULL handling within the function.

So if the function you are going to write does not explicitly has a special need to allow NULL values as input, use int&. See also this Wikipedia entry.

Note that you should not make your decision based on which of the 2 alternatives is faster. Your first priority should be correct code, not any micro-optimizations, which I would expect in this case to be neglectable.

Find elsewhere
🌐
Javatpoint
javatpoint.com › c-dereference-pointer
C Dereference Pointer - javatpoint
C Dereference Pointer with Tutorial or what is c programming, C language with programming examples for beginners and professionals covering concepts, control statements, c array, c pointers, c structures, c union, c strings and more.
🌐
Cornell Computer Science
cs.cornell.edu › courses › cs3410 › 2024fa › rsrc › c › pointers.html
Pointers - CS 3410
Once you have a pointer with a ... in the box at the end of the arrow. For this, C has the * operator, known as the “dereferencing” operator because it follows a reference (pointer) and gives you the referred-to value....
🌐
Stack Overflow
stackoverflow.com › questions › 48715652 › pointers-dereferencing-and-referencing
c - Pointers, dereferencing and referencing - Stack Overflow
the address to which it points). The value of ptr is therefore a valid input, and you are seeing the expected result. %s expects a pointer to a NUL-terminated sequence of char values, and prints those char values (but not the NUL).
🌐
Weber State University
icarus.cs.weber.edu › ~dab › cs1410 › textbook › 4.Pointers › dereference.html
4.4. Dereferencing A Pointer: The Indirection Operator
This connection makes it possible ... to change the value of i without using variable name i: *p = 321;. Accessing i indirectly through p is called dereferencing p or more generally dereferencing a pointer....
🌐
Scaler
scaler.com › home › topics › c dereference pointer
C Dereference pointer- Scaler Topics
May 30, 2023 - Then we created a pointer ptr, and assigned the address of x to this pointer by using the & which is known as the address of operator. Finally, we dereferenced the ptr pointer by using the * (asterisk) operator (which is also known as the dereferencing operator) and we put the value of this pointer in the deref variable.
🌐
Medium
medium.com › @Dev_Frank › dereferencing-of-pointers-2fdb8dd8246c
DEREFERENCING OF POINTERS. Dereferencing a pointer means accessing… | by Dev Frank | Medium
February 16, 2024 - Change the value of variable ‘point’ by dereferencing the pointer ‘ptr’. ... The above line modifies the value of variable ‘point’ from 9 to 8 because ‘ptr’ points to the location of ‘point,’ and dereferencing ‘ptr’ (i.e., *ptr = 8) updates the value of ‘point.’
🌐
Cprogramming.com
cprogramming.com › reference › dereference.html
Dereferencing pointers in C and C++ - Cprogramming.com
How to begin Get the book · C tutorial C++ tutorial Game programming Graphics programming Algorithms More tutorials
Top answer
1 of 6
919

Reviewing the basic terminology

It's usually good enough - unless you're programming assembly - to envisage a pointer containing a numeric memory address, with 1 referring to the second byte in the process's memory, 2 the third, 3 the fourth and so on....

  • What happened to 0 and the first byte? Well, we'll get to that later - see null pointers below.
  • For a more accurate definition of what pointers store, and how memory and addresses relate, see "More about memory addresses, and why you probably don't need to know" at the end of this answer.

When you want to access the data/value in the memory that the pointer points to - the contents of the address with that numerical index - then you dereference the pointer.

Different computer languages have different notations to tell the compiler or interpreter that you're now interested in the pointed-to object's (current) value - I focus below on C and C++.

A pointer scenario

Consider in C, given a pointer such as p below...

Copyconst char* p = "abc";

...four bytes with the numerical values used to encode the letters 'a', 'b', 'c', and a 0 byte to denote the end of the textual data, are stored somewhere in memory and the numerical address of that data is stored in p. This way C encodes text in memory is known as ASCIIZ.

For example, if the string literal happened to be at address 0x1000 and p a 32-bit pointer at 0x2000, the memory content would be:

CopyMemory Address (hex)    Variable name    Contents
1000                                     'a' == 97 (ASCII)
1001                                     'b' == 98
1002                                     'c' == 99
1003                                     0
...
2000-2003               p                1000 hex

Note that there is no variable name/identifier for address 0x1000, but we can indirectly refer to the string literal using a pointer storing its address: p.

Dereferencing the pointer

To refer to the characters p points to, we dereference p using one of these notations (again, for C):

Copyassert(*p == 'a');  // The first character at address p will be 'a'
assert(p[1] == 'b'); // p[1] actually dereferences a pointer created by adding
                     // p and 1 times the size of the things to which p points:
                     // In this case they're char which are 1 byte in C...
assert(*(p + 1) == 'b');  // Another notation for p[1]

You can also move pointers through the pointed-to data, dereferencing them as you go:

Copy++p;  // Increment p so it's now 0x1001
assert(*p == 'b');  // p == 0x1001 which is where the 'b' is...

If you have some data that can be written to, then you can do things like this:

Copyint x = 2;
int* p_x = &x;  // Put the address of the x variable into the pointer p_x
*p_x = 4;       // Change the memory at the address in p_x to be 4
assert(x == 4); // Check x is now 4

Above, you must have known at compile time that you would need a variable called x, and the code asks the compiler to arrange where it should be stored, ensuring the address will be available via &x.

Dereferencing and accessing a structure data member

In C, if you have a variable that is a pointer to a structure with data members, you can access those members using the -> dereferencing operator:

Copytypedef struct X { int i_; double d_; } X;
X x;
X* p = &x;
p->d_ = 3.14159;  // Dereference and access data member x.d_
(*p).d_ *= -1;    // Another equivalent notation for accessing x.d_

Multi-byte data types

To use a pointer, a computer program also needs some insight into the type of data that is being pointed at - if that data type needs more than one byte to represent, then the pointer normally points to the lowest-numbered byte in the data.

So, looking at a slightly more complex example:

Copydouble sizes[] = { 10.3, 13.4, 11.2, 19.4 };
double* p = sizes;
assert(p[0] == 10.3);  // Knows to look at all the bytes in the first double value
assert(p[1] == 13.4);  // Actually looks at bytes from address p + 1 * sizeof(double)
                       // (sizeof(double) is almost always eight bytes)
++p;                   // Advance p by sizeof(double)
assert(*p == 13.4);    // The double at memory beginning at address p has value 13.4
*(p + 2) = 29.8;       // Change sizes[3] from 19.4 to 29.8
                       // Note earlier ++p and + 2 here => sizes[3]

Pointers to dynamically allocated memory

Sometimes you don't know how much memory you'll need until your program is running and sees what data is thrown at it... then you can dynamically allocate memory using malloc. It is common practice to store the address in a pointer...

Copyint* p = (int*)malloc(sizeof(int)); // Get some memory somewhere...
*p = 10;            // Dereference the pointer to the memory, then write a value in
fn(*p);             // Call a function, passing it the value at address p
(*p) += 3;          // Change the value, adding 3 to it
free(p);            // Release the memory back to the heap allocation library

In C++, memory allocation is normally done with the new operator, and deallocation with delete:

Copyint* p = new int(10); // Memory for one int with initial value 10
delete p;

p = new int[10];      // Memory for ten ints with unspecified initial value
delete[] p;

p = new int10;    // Memory for ten ints that are value initialised (to 0)
delete[] p;

See also C++ smart pointers below.

Losing and leaking addresses

Often a pointer may be the only indication of where some data or buffer exists in memory. If ongoing use of that data/buffer is needed, or the ability to call free() or delete to avoid leaking the memory, then the programmer must operate on a copy of the pointer...

Copyconst char* p = asprintf("name: %s", name);  // Common but non-Standard printf-on-heap

// Replace non-printable characters with underscores....
for (const char* q = p; *q; ++q)
    if (!isprint(*q))
        *q = '_';

printf("%s\n", p); // Only q was modified
free(p);

...or carefully orchestrate reversal of any changes...

Copyconst size_t n = ...;
p += n;
...
p -= n;  // Restore earlier value...
free(p);

C++ smart pointers

In C++, it's best practice to use smart pointer objects to store and manage the pointers, automatically deallocating them when the smart pointers' destructors run. Since C++11 the Standard Library provides two, unique_ptr for when there's a single owner for an allocated object...

Copy{
    std::unique_ptr<T> p{new T(42, "meaning")};
    call_a_function(p);
    // The function above might throw, so delete here is unreliable, but...
} // p's destructor's guaranteed to run "here", calling delete

...and shared_ptr for share ownership (using reference counting)...

Copy{
    auto p = std::make_shared<T>(3.14, "pi");
    number_storage1.may_add(p); // Might copy p into its container
    number_storage2.may_add(p); // Might copy p into its container    } // p's destructor will only delete the T if neither may_add copied it

Null pointers

In C, NULL and 0 - and additionally in C++ nullptr - can be used to indicate that a pointer doesn't currently hold the memory address of a variable, and shouldn't be dereferenced or used in pointer arithmetic. For example:

Copyconst char* p_filename = NULL; // Or "= 0", or "= nullptr" in C++
int c;
while ((c = getopt(argc, argv, "f:")) != -1)
    switch (c) {
      case f: p_filename = optarg; break;
    }
if (p_filename)  // Only NULL converts to false
    ...   // Only get here if -f flag specified

In C and C++, just as inbuilt numeric types don't necessarily default to 0, nor bools to false, pointers are not always set to NULL. All these are set to 0/false/NULL when they're static variables or (C++ only) direct or indirect member variables of static objects or their bases, or undergo zero initialisation (e.g. new T(); and new T(x, y, z); perform zero-initialisation on T's members including pointers, whereas new T; does not).

Further, when you assign 0, NULL and nullptr to a pointer the bits in the pointer are not necessarily all reset: the pointer may not contain "0" at the hardware level, or refer to address 0 in your virtual address space. The compiler is allowed to store something else there if it has reason to, but whatever it does - if you come along and compare the pointer to 0, NULL, nullptr or another pointer that was assigned any of those, the comparison must work as expected. So, below the source code at the compiler level, "NULL" is potentially a bit "magical" in the C and C++ languages...

More about memory addresses, and why you probably don't need to know

More strictly, initialised pointers store a bit-pattern identifying either NULL or a (often virtual) memory address.

The simple case is where this is a numeric offset into the process's entire virtual address space; in more complex cases the pointer may be relative to some specific memory area, which the CPU may select based on CPU "segment" registers or some manner of segment id encoded in the bit-pattern, and/or looking in different places depending on the machine code instructions using the address.

For example, an int* properly initialised to point to an int variable might - after casting to a float* - access memory in "GPU" memory quite distinct from the memory where the int variable is, then once cast to and used as a function pointer it might point into further distinct memory holding machine opcodes for the program (with the numeric value of the int* effectively a random, invalid pointer within these other memory regions).

3GL programming languages like C and C++ tend to hide this complexity, such that:

  • If the compiler gives you a pointer to a variable or function, you can dereference it freely (as long as the variable's not destructed/deallocated meanwhile) and it's the compiler's problem whether e.g. a particular CPU segment register needs to be restored beforehand, or a distinct machine code instruction used

  • If you get a pointer to an element in an array, you can use pointer arithmetic to move anywhere else in the array, or even to form an address one-past-the-end of the array that's legal to compare with other pointers to elements in the array (or that have similarly been moved by pointer arithmetic to the same one-past-the-end value); again in C and C++, it's up to the compiler to ensure this "just works"

  • Specific OS functions, e.g. shared memory mapping, may give you pointers, and they'll "just work" within the range of addresses that makes sense for them

  • Attempts to move legal pointers beyond these boundaries, or to cast arbitrary numbers to pointers, or use pointers cast to unrelated types, typically have undefined behaviour, so should be avoided in higher level libraries and applications, but code for OSes, device drivers, etc. may need to rely on behaviour left undefined by the C or C++ Standard, that is nevertheless well defined by their specific implementation or hardware.

2 of 6
134

Dereferencing a pointer means getting the value that is stored in the memory location pointed by the pointer. The operator * is used to do this, and is called the dereferencing operator.

Copyint a = 10;
int* ptr = &a;

printf("%d", *ptr); // With *ptr I'm dereferencing the pointer. 
                    // Which means, I am asking the value pointed at by the pointer.
                    // ptr is pointing to the location in memory of the variable a.
                    // In a's location, we have 10. So, dereferencing gives this value.

// Since we have indirect control over a's location, we can modify its content using the pointer. This is an indirect way to access a.

 *ptr = 20;         // Now a's content is no longer 10, and has been modified to 20.
🌐
Cplusplus
cplusplus.com › doc › tutorial › pointers
Pointers
Pointers are said to "point to" the variable whose address they store. An interesting property of pointers is that they can be used to access the variable they point to directly. This is done by preceding the pointer name with the dereference operator (*). The operator itself can be read as ...
🌐
GeeksforGeeks
geeksforgeeks.org › c language › dereference-reference-dereference-reference
Output of the C Program | Dereference and Reference - GeeksforGeeks
April 16, 2025 - Explanation: The expression *&*&*ptr dereferences ptr to get the character 'g' from the string "geeksforgeeks". First, ptr is dereferenced to get 'g', then address is obtained returning ptr.
🌐
C# Corner
c-sharpcorner.com › article › dereferencing-pointers-and-void-pointers-in-c
Dereferencing Pointers and Void Pointers in C
Dereferencing is an operation performed to access and manipulate data contained in the memory location pointed to by a pointer. The operator * is used to dereference pointers. A pointer variable is dereferenced when the unary operator *, in ...
🌐
Reddit
reddit.com › r/learnprogramming › eli5 (explain like i'm five): pointers and dereferencing in c, please!
r/learnprogramming on Reddit: ELI5 (Explain like I'm five): Pointers and dereferencing in C, please!
July 24, 2013 -

Hello all!

I'm taking a class on C programming, along with some machine language, and I can't seem to grasp pointers. Can someone please explain pointers, double pointers, and even triple pointers (As I understand, thats like a dictionary) using whatever simple means necessary!

Top answer
1 of 3
5
http://www.reddit.com/r/learnprogramming/comments/k4lgc/can_someone_explain_pointers_in_c_to_me_like_im_10/ http://www.reddit.com/r/learnprogramming/comments/szt3y/what_is_the_primary_difference_between_a_pointer/ http://www.reddit.com/r/learnprogramming/comments/1iezes/c_pointers_what_are_the_common_misconceptions/ http://www.reddit.com/r/learnprogramming/comments/15sex9/c_question_about_pointers_concepts/ http://www.reddit.com/r/learnprogramming/comments/14flxg/whats_the_best_way_to_understand_pointers_in_c/ http://www.reddit.com/r/learnprogramming/comments/1iik3e/c_two_or_so_questions_about_the_nature_of_pointers/ http://www.reddit.com/r/learnprogramming/comments/kzbn6/whats_the_point_of_pointers/ http://www.reddit.com/r/learnprogramming/comments/1bjo8n/c_issues_with_structures_and_double_pointers/ http://www.reddit.com/r/learnprogramming/comments/18n3pr/c_how_to_allocate_memory_to_a_pointer_using_the/ Etc... I've used the "search" function here; I hope that's simple enough. ;)
2 of 3
2
Lets say you have a key to a safety deposit box in a bank. This key has a number on it, the number of the box that it goes to. This key is like your pointer, and the number is the memory address that the pointer is pointing to. Dereferencing is like opening the box A that key A corresponds to and accessing that value. You could have a case of a double pointer, where the box itself contains key B to box B. With triple pointers, inside box B is key C that accesses box C, and so on and so forth.
🌐
GNU
gnu.org › software › c-intro-and-ref › manual › html_node › Pointer-Dereference.html
Pointer Dereference (GNU C Language Manual)
The main use of a pointer value is to dereference it (access the data it points at) with the unary ‘*’ operator. For instance, *&i is the value at i’s address—which is just i.