this post was submitted on 29 Dec 2024
347 points (100.0% liked)

Programmer Humor

23528 readers
1970 users here now

Welcome to Programmer Humor!

This is a place where you can post jokes, memes, humor, etc. related to programming!

For sharing awful code theres also Programming Horror.

Rules

founded 2 years ago
MODERATORS
 
you are viewing a single comment's thread
view the rest of the comments
[–] [email protected] 21 points 5 months ago* (last edited 5 months ago) (1 children)

Mostly because at the lowest level of computing (machine code and CPU instructions), pointers are the only method (that I know of) of any kind of indirection.

At the lowest level, there are 2 types of references:

  • CPU registers
  • memory addresses (pointers)

Every higher level language feature for memory management (references, objects, safe pointers, garbage collection, etc) is just an abstraction over raw pointers

Pointers themselves are really just abstractions over raw integers, whose sole purpose is to index into RAM

With that in mind, pointers to pointers are a natural consequence of any kind of nested object hierarchy (linked lists, trees, objects with references to other objects, etc)


The only other kind of indirection would be self-modifying machine code (like a Wheeler Jump). But the computing world at large has nixed that idea for a multitude of reasons

[–] [email protected] 2 points 5 months ago (1 children)

linked lists, trees, objects with references to other objects

That’s not a pointer to another pointer, but a pointer to a data structure that happens to contain another pointer.

[–] [email protected] 16 points 5 months ago* (last edited 5 months ago) (2 children)

The distinction is meaningless in the land of Opcode's and memory addresses

For example, a struct is just an imaginary "overlay" on top of a contiguous section of memory

Say you have a struct

struct Thing {
  int a;
  int b;
  Thing* child;
}

Thing foo {}

You could easily get a reference to foo->child->b by doing pointer arithmetic

*((*((*foo) + size(int)*2)) +size(int))

(I've not used C much so I've probably got the syntax wrong)

[–] [email protected] 1 points 5 months ago (1 children)

Yes, you can do crazy shit if you try hard enough, but every reasonable programmer would access foo->child->b als foo->child->b and not via that crazy LISPy expression.

By question was: Why would you have a pointer to a memory address that itself only holds a pointer somewhere else?

So far the only reasonable explanation is from @[email protected]:

  • arrays of function pointers
  • pass by reference of a pointer
[–] [email protected] 1 points 5 months ago

I'm more talking about theory than practical.

I've not developed anything in C/C++, so I don't know practical uses for a double pointer, aside from multidimensional arrays, or arrays of pointers

My point was that, conceptually, pointers to pointers is how most complex data structures work. Even if the C representation of said code doesn't have a int** somewhere

[–] [email protected] 1 points 5 months ago

Magic.

Blasphemy.