Edward Bartolo <edb...@gmail.com> 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.
_______________________________________________
Dng mailing list
Dng@lists.dyne.org
https://mailinglists.dyne.org/cgi-bin/mailman/listinfo/dng

Reply via email to