Continuing my C studies, I started trying to do all sorts of things with pointers. And below is the code I worked on
int main()
{
int array[] = { 3,2,6776,4 };
int *x;
int** pointer = &x;
doIT((int *)array, 4, pointer);
printf("\n Value %d",**pointer);
printf("\n Addrees 1 %p",*&pointer);
printf("\n address 2 %p", &pointer);
}
void doIT(int *p, int sizes, int** pointer) {
for (int i = 0; i < sizes; i )
{
if (i == 2)
{
*pointer = p;
}
p ;
}
}
I tried to play with pointers and see what I would get in their prints so that I could understand how the pointers really work, and I didn't understand something, how the first address got the first value of Pointer, after all I used *&, that is, I accessed the value of the first pointer and from there I took the other's address,
And when printing the second address, why don't I print the main address of the pointer? (0x0097f804)?
I would really appreciate some help or even some kind of drawing in order to really understand the issue of pointers Thanks a lot guys
CodePudding user response:
Whenever you have problems understanding pointers, or problems visualizing them, bring out some paper and a pencil and draw it. Boxes for data, variables, etc., and arrows for the pointers.
If we do it in a little more primitive way, after the call
doIT((int *)array, 4, pointer);
you will have something that looks like this:
----------
| array[0] |
----------
| array[1] |
--------- --- ----------
| pointer | --> | x | --> | array[2] |
--------- --- ----------
| array[3] |
----------
When you print *&pointer then that's the same as pointer.
When you print &pointer then that's the location of the pointer variable. I.e. it's a pointer to the variable pointer and will have the type int ***.
CodePudding user response:
The pointer pointer stores the address of the pointer x
int *x;
int** pointer = &x;
So these two calls of printf will output the same value
printf( "pointer = %p\n", ( void * )pointer );
printf( "&x = %p\n", ( void * )&p );
The expression &pointer yields the address of the variable pointer. That is the expression points to the pointer pointer. Dereferencing the expression *( &pointer ) you will get the original variable pointer. So the expression *&pointer is the same as the expression pointer.
To make it more clear consider the following simple program.
#include <stdio.h>
int main( void )
{
int x = 10;
printf( "x = %d\n", x );
printf( "*&x = %d\n", *&x );
}
Its output is
x = 10
*&x = 10
The difference between this demonstration program and your code is that the variable x has the type int while the variable pointer has the type int **. But in the both cases calls of printf output the values stored in these variables.


