Edward Bartolo <edbarx@???> writes:
> As the title of the email indicates, I am doing some exercises to make
> sense out of C pointer syntax. I have been using pointers for as long
> as I have been programming without issues, apart from the usual
> initial programmatic errors when new code is run for the first time.
> However, C pointer syntax is proving to be as unintuitive as it can
> be. For this reason, I am doing some exercises regarding C pointer
> use.
[...]
> #include <stdio.h>
>
> void change_value(void* ptr) {
> *((int*) ptr) = 20000000;
> }
You could have declared that as int *ptr in order to get rid of the
cast. Also, the precedence is such that
*(int *)p = 20000000;
would work.
[...]
> #include <stdio.h>
> #include <stdlib.h>
>
> void change_value(void** ptr) {
This is a somewhat dubious construct as every pointer is required to be
convertible from and to void * but not void **.
> int* i = (int*) malloc(sizeof(int));
The cast is not necessary. And you don't really need the intermediate
pointer.
-------
#include <stdio.h>
#include <stdlib.h>
void change_value(int **ptr) {
*ptr = malloc(sizeof(**ptr));
**ptr = 10001002;
}
int main() {
int* p;
change_value(&p);
printf("p = %d\n", *p);
free(p);
return 0;
}
------
This becomes much less arcane-looking when letting go of the Pascal-y
'bad habit' of using pass-by-reference to create procedure returning
values.
------
#include <stdio.h>
#include <stdlib.h>
int *array_1(void)
{
int *pi;
pi = malloc(sizeof(*pi));
*pi = 10001002;
return pi;
}
int main() {
int* p;
p = array_1();
printf("p = %d\n", *p);
free(p);
return 0;
}
------
One thing to note here: Every C pointer is really a pointer to an array
of values, although the size of the array may just be one. Given the
above, both *p and p[0] are equally legitimate ways to access the
value. As per C definition, p[0] can also be written as 0[p] or *(p + 0)
the same being true for any other valid (not out-of-bounds) index.