Unborn - 1 year ago 83
C Question

# Having trouble explaining this C example prblm dealing with pointers

I'm having trouble understanding what the output would be

``````int main( ) {
int x = 5, y = 10, z = 20;
int *ptr1 = &x, *ptr2 = &y, *ptr3 = &z;
*ptr2 = *ptr3 + *ptr1;
ptr2 = ptr1;
*ptr2 = *ptr3;
printf("%d and %d and %d\n", x,y,z);

/*char str[] = "Stackoverflow is kind.";
int len = strlen(str);
printf("%s and %d\n", str, len);

char *p;
p = str;
printf("%c and %c and %c and %c\n",
*p, str[3], *(p+9), str[len-2]);*/
return 0;
}
``````

Would the first addition line even be allowed? I thought you couldn't add pointers. And what would the difference be between these 2 lines?

``````ptr2 = ptr1;
*ptr2 = *ptr3;
``````

Obviously they are different pointers, but how do they function differently?

I've ran the program and got 20 25 20 but I don't understand how

After executing the lines

``````int x = 5, y = 10, z = 20;
int *ptr1 = &x, *ptr2 = &y, *ptr3 = &z;
``````

the following conditions are true:

`````` ptr1  == &x
*ptr1  ==  x ==  5
ptr2  == &y
*ptr2  ==  y == 10
ptr3  == &z
*ptr3  ==  z == 20
``````

Thus, the expression `*ptr1` is the same as the expression `x`, `*ptr2` is the same as `y`, etc. So the line

``````*ptr2 = *ptr3 + *ptr1;
``````

isn't adding the pointer values, it's adding the values of the objects the pointers point to - IOW, this is equivalent to writing

``````y = x + z;
``````

In the line

``````ptr2 = ptr1;
``````

you're setting `ptr2` to same value as `ptr1`, meaning it will point to the same object as `ptr1`. After this line, the following conditions are all true:

`````` ptr2 ==  ptr1 == &x
*ptr2 == *ptr1 ==  x == 10
``````

Finally, the line

``````*ptr2 = *ptr3;
``````

sets the value of the object that `ptr2` points to (`x`) to the value of the object that `ptr3` points to (`z`); IOW, this is equivalent to writing

``````x = z;
``````

So, over the course of the program:

``````y = z + x == 25
x = z == 20
``````