| Here's how I understand it. One important (and beautiful) thing to understand about C is that declarations and use in C mirror each other. Consider the same type written in Go and C: array of ten pointers to functions from int to int. Go: var funcs [10]*func(int) int C: int (*funcs[10])(int) Go's version reads left to right, clearly. C version is ugly. But beautiful thing about C version is that it mirrors how funcs can be used: (*funcs[0])(5) See how it's just like the declaration. Go's version doesn't have this property. So, now about the *. Usage of * doesn't require spaces. If p is a pointer to int, you use it like this: *p And not like this: * p And since type declarations follow usage, therefore "int *p" makes more sense. There is also a good argument about "int *p, i". In the end, these usages follow from how the C grammar works. There are many more musings about that on the web, but here is one of my favourites: https://go.dev/blog/declaration-syntax. Edit: HN formatting. |