I have a question that is raised from this discussion: C - modify the address of a pointer passed to a function
Let's say I have the following code:
#include <stdio.h>
foo(char **ptr){
*ptr++;
}
int main()
{
char *ptr = malloc(64);
char arr[] = "Hello World!";
memcpy(ptr, arr, sizeof(arr));
foo(&ptr);
foo(&ptr);
printf("%s",ptr);
return 0;
}
I was wondering what the output of this program would be and I thought that it should be llo World!
.
After some investigation I found the question linked above and realized that, in C, parameters to functions are always passed by value. So far there was no problem. When it comes to change *ptr++;
expression to -> *ptr = *ptr +1;
output becomes: llo World!
.
At this point, I can say that I am a little confused. In order to change pointer address, we need a double pointer. That is fine, but why do post increment operations differ? Is it because of the operator precedence?
Here I tried the example in an online C compiler.
When a pointer is incremented, it actually increments by the number equal to the size of the data type for which it is a pointer. For Example: If an integer pointer that stores address 1000 is incremented, then it will increment by 2(size of an int) and the new address it will points to 1002.
Increment() Function It takes a variable and increments (changes) its value, and also returns this value. The increment can be a positive or negative number. Note: The Increment() function changes the value of its first argument.
Try using (*count)++ . *count++ might be incrementing the pointer to next position and then using indirection (which is unintentional).
The postfix increment operator ++
has higher precedence than the dereference operator *
. So this:
*ptr++;
Parses as:
*(ptr++);
So it changes the parameter value itself, not what it points to. You instead want:
(*ptr)++;
Postfix operators have higher priority than unary operators. So this expression
*ptr++
is equivalent to
*( ptr++ )
The value of the sub-expression ptr++
is the value of the pointer before its incrementing.
So actually you are incrementing the parameter ptr
having the type char **
. So this incrementing does not change the original pointer and does not make a sense.
Instead you could write
( *ptr )++
But it will be more clear and less confusing to use the unary increment operator like
++*ptr
if you want to increment the original pointer itself.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With