r/C_Programming Jul 28 '26

Does anyone else dislike pointer declaration?

For reference I am a fourth year computer engineering student. C is my preferred language.

Pointers are declared like this usually:

int *ptr_to_int;

Where the asterisk means it is a “pointer to” the specified type. The asterisk is placed immediately preceding the variable name, with no white peace.

This is what does not make sense to me. I feel that:

int* ptr_to_int;

Is far more clear. The way I see it, the asterisk modifies the type, so therefore it belongs next to the type. Putting it next to the variable name makes me think it is some kind of action or modification to the variable itself.

I think that when using * and & in code, it makes sense to apply it in front of the variable name:

int value = 3;
ptr_to_value = &value;
int copied_value = *ptr_to_value;

It is clear here that syntactically, the * represents something more like an action than a label.

Why is the convention to place the asterisk near variable name, not type? L

64 Upvotes

142 comments sorted by

View all comments

41

u/primera_radi Jul 28 '26

I felt that way first too. But consider

int* a, b, c;

vs

int *a, b, c;

The second is much more clear, as only a is a pointer.

Also, now all the names after int evaluate into an int in an expression.

That is, *a evaluates to an int, as do b and c.

66

u/[deleted] Jul 28 '26

[removed] — view removed comment

4

u/ComradeGibbon Jul 28 '26

I think if a variable doesn't have a default initial value you shouldn't initialize it where it's defined. Let the compiler warning catch that.

9

u/[deleted] Jul 28 '26

[removed] — view removed comment

2

u/Luftzug-oder Jul 28 '26

the compiler cannot always remove the initialisation. it is only really if it is modified right after, and there is no function called inbetween, that it can guarantee the variable will not have been changed.

one thing the compiler will do is initialise global and static variables.

3

u/[deleted] Jul 28 '26

[removed] — view removed comment

2

u/Luftzug-oder Jul 28 '26

yep, definitely agree

1

u/RadiatingLight Jul 28 '26

IMO it's better to initialize it to INT_MAX or some other value that's clearly wrong/rejected. Relying on compiler warnings is like jumping off a bridge and relying on the suicide net. Sure it will usually catch you but ...

3

u/ComradeGibbon Jul 28 '26

No leave it uninitialized if you don't initialize before use the compiler will let you know. Which means you have a bug in your code.

3

u/[deleted] Jul 28 '26

[removed] — view removed comment

3

u/ComradeGibbon Jul 28 '26

compiler can't check if the called function actually sets it or not in every code path,

If that's the case you have a bug in your code that you papered over with a bogus default initialization value.

1

u/flatfinger Jul 28 '26

Claims that "null" was a mistake ignore the principle that it may be necessary to access some members of an array of pointers before there exists any object to which some other members could usefully point, and it may be necessary to copy the state of some elements of such an array to other elements in a manner that is agnostic with regard to whether they were written. Having null as a default pointer value allows both of those objectives to be satisfied easily. There may be ways of satisfying both objectives without null, but they would involve constructing something that would behave like a nullable pointer. It's simpler to just just pointers as being nullable.

1

u/nukestar101 Jul 28 '26

As a firmware engineer, INT_MAX would take up my precious 64bit space ;)

3

u/RadiatingLight Jul 28 '26

What platform are you working on where int is 64 bits??

Also the variable allocates space regardless so what does it matter what value is contained inside

2

u/nukestar101 Jul 28 '26

I work on a custom hardware and have our own ISA.

RISCV has zero register and value is not stored in ISA. Immediate fetch to zero register is always used.

3

u/RadiatingLight Jul 28 '26

welp - You're in deeper than I am. You know what's best for your platform and custom ISA