• GissaMittJobb@lemmy.ml
    link
    fedilink
    arrow-up
    65
    arrow-down
    2
    ·
    5 months ago

    Having an asterisk both be the type indicator and the dereference operator is one of the great programming language design blunders of our time, along with allowing nulls for any type in so many languages.

  • blackstrat@lemmy.fwgx.uk
    link
    fedilink
    arrow-up
    63
    arrow-down
    5
    ·
    5 months ago

    The fact it’s a pointer is part of the type, not part of the variable name. So int* p is the way.

    • sweng@programming.dev
      link
      fedilink
      arrow-up
      84
      arrow-down
      2
      ·
      edit-2
      5 months ago

      You would think so, but int* a, b is actually eqivalent to int* a; int b, so the asterisk actually does go with the name. Writing int* a, *b is inconsistent, so int *a, *b is the way to go.

      • newH0pe@feddit.de
        link
        fedilink
        arrow-up
        55
        arrow-down
        1
        ·
        5 months ago

        Yeah, and I’d say that’s a design flaw of the language as it is unintuitive behaviour.

      • Slotos@feddit.nl
        link
        fedilink
        arrow-up
        38
        ·
        5 months ago

        When people say “pointers are hard”, they mean “I have no idea where the star goes and now an ampersand is also implicated”.

      • blackstrat@lemmy.fwgx.uk
        link
        fedilink
        arrow-up
        23
        ·
        5 months ago

        While technically true, that’s also one of the worst ‘features’ of the language and I personally consider it a bug in the language. Use two lines and make it clear and correct.

      • Gladaed@feddit.de
        link
        fedilink
        arrow-up
        16
        arrow-down
        1
        ·
        5 months ago

        Don’t declare more than 1 pointer per line. This resolves that, badly.

    • shami1kemi1@sopuli.xyz
      link
      fedilink
      arrow-up
      15
      arrow-down
      1
      ·
      5 months ago

      Then again, at least in C, the mantra is “declaration follows usage”. Surely you don’t write pointer dereferences as * ptr? Most likely not, you most likely write it as *ptr. The idea behind the int *ptr; syntax is basically that when you do *ptr, you get an int.

      And with this idea, stuff like function pointers (int (*f)(void)), arrays of pointers (int *a[10]) versus pointers of arrays (int (*a)[10]) etc. start making sense. It’s certainly not the best way to design the syntax, and I’m as much a fan of the Pascal-styled “type follows the identifier” syntax (e.g. let x: number;) as anyone, but the C way does have a rhyme and a reason for the way it is.

    • Traister101@lemmy.today
      link
      fedilink
      arrow-up
      6
      ·
      edit-2
      5 months ago

      It’s part of the type yet it’s also a unique identifier. That’s the whole thing with east or west const. const int * is a immutable mutable pointer that points to mutable immutable memory. int *const is a mutable immutable pointer that points to immutable memory. int const * is the same type as the first example, a immutable mutable pointer that points to mutable immutable memory.

      Same stuff applies to references which makes it easier to think of the variable owning the * or & as if you want that pointer or reference to be const it has to go after.

      Edit:I am a moron who managed to get it exactly backwards :|

        • SpaceNoodle@lemmy.world
          link
          fedilink
          arrow-up
          4
          ·
          5 months ago

          I wrote a couple unholy lines of C++ the other day using the ternary conditional operator to select a class member function to be called with a fixed argument.

          I think my teammates were too scared to call me out on it.

      • YaBoyMax@programming.dev
        link
        fedilink
        English
        arrow-up
        3
        ·
        5 months ago

        I think you’ve got it backwards. I learned to read pointer decls from right-to-left, so const int * is a (mutable) pointer to an int which is const while int *const is a const pointer to a (mutable) int.

    • Scoopta@programming.dev
      link
      fedilink
      arrow-up
      5
      arrow-down
      1
      ·
      5 months ago

      I do this in my code because it looks better and makes more sense…until I decide to declare 2 vars on one line and then I use the very cursed int* a, *b

    • owsei@lemmy.world
      link
      fedilink
      arrow-up
      4
      arrow-down
      1
      ·
      5 months ago

      tbh I always think about it as ‘p’ is a pointer to int

      therefore *p is an int

      therefore I should call it int *p;

      however, of course, you should use what your team prefers. Having good yet inconsistent style is worst than mid consistent style.

    • ShortFuse@lemmy.world
      link
      fedilink
      arrow-up
      3
      arrow-down
      1
      ·
      edit-2
      5 months ago

      I don’t code much C++, but then I’d lose alignment with: x = *p; and I feel that would bug me.

      I’m looking at Google Style Guide for my next project and it says either is fine, just don’t declare more than one per line.

  • dbilitated@aussie.zone
    link
    fedilink
    arrow-up
    15
    arrow-down
    1
    ·
    5 months ago

    I’m just a c# dev wishing to fuck we had something visual to indicate reference types so my coworkers could stop misusing them

  • RandomCookie420@eviltoast.org
    link
    fedilink
    English
    arrow-up
    4
    arrow-down
    2
    ·
    5 months ago

    Ever written a entire php in one line? I did, and that without separation whenever possible.

    Man my coworker even ended the trolling contest over that.