Hacker News new | past | comments | ask | show | jobs | submit login

Compare

   char (*(*x())[5])();
and

   var x: pointer to func() pointer to array[5] of pointer to func() char;
or if you wish to replace some keywords with glyphs:

   var x: ^func() ^[5] ^func() char;
And it's always a nice puzzle for the reader to explain why there are three "pointer" in cdecl output and three carets in the ALGOL-like declaration, but only two asterisks in the C declaration.



In this case, the C declaration doesn't match the other two. The variable x is a function that returns a pointer to an array of 5 pointers to functions returning char. Indeed, that's what cdecl.org says:

  declare x as function returning pointer to array 5 of pointer to function returning char
Using the notation you did, that would be:

  var x: func() ^[5] ^func() char
There are only two arrows there now.

If you wanted a pointer to a function like this, you would need a third asterisk in the declaration:

  char (*(*(*x)())[5])();


Oh, good catch, thank you! But I remember an example with some other tricky C expression/type declarator where the number of actual dereferences differed from the amount of asterisks in the code.

> Using the notation you did, that would be:

Well, it'd be

    func x() ^[5] ^func() char; ...
because it's a function declaration, after all, not a variable.


> But I remember an example with some other tricky C expression/type declarator where the number of actual dereferences differed from the amount of asterisks in the code.

Was it this code?

  void f(int *a) {
      void *p = &a;
      ***(int*(*)[])p = 1;
  }
Reading your comment made me think of this. I tried to find the original post for this, but it seems it was deleted. I only found it again through this post: https://zig.news/sobeston/using-zig-and-translate-c-to-under...




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: