Reputation: 245
If we have a char *hello
- and the string is "hello"
and i do
char *ptr;
ptr = hello;
then ptr will be pointing at 'h'
, correct?
Now I have just done an assignmnet in this and completed it using the following terms
if i wanted to move the pointer to the next chatachter i would just do ptr++
. If i wanted to use the value of the pointer for some check, i would use if(*ptr == '\0')...
When i was doing the assignmnets our teacher gave us some pre built methods, and they used stuff like
*string++ = *s++;
ok, so why would we want to do *string
(which gets a value) - and combine it with ++
I hope i make sense in explaining what is not clear. Its just I managed to do the whole assignment with ptr++ to move to next element or *ptr to check its value
Upvotes: 2
Views: 252
Reputation: 21
Just a quick addition to Mark Byers' answer, who correctly points out the postfix increment ("a++") as opposed to the prefix increment ("++a").
You probably want to have a look at the C operator precedence for the order in which operators are handled in an expression.
You can always force the precedence you want by using parentheses: (a + b) * c != a + b * c.
Upvotes: 0
Reputation: 35594
The idiom *s++
means "take the value pointed to, and switch to the next one".
This way you can do your check operations in a loop. The assignment *p++ = *q++
copies the value of *q
to the place pointed by p
, and shifts both p
and q
to the next place, so the next time you execute *p++ = *q++
the next character will be copied behind the first one. And so on.
Upvotes: 5
Reputation: 56123
then ptr will be pointing at h, correct?
Yes, correct.
ok, so why would we want to do *string(which gets a value)
The '*' doesn't necessarily get a value: it may set a value, depending on which side of the '=' sign it is.
char *ptr;
ptr = "hello";
char firstLetter = *ptr; //get the value: now firstLetter contains 'h'
*ptr = 'w'; //set the value: now ptr is pointing to "wello".
Combining * with ++ means that you do one after the other:
Combining them into a single statement simply a shorter, more compact (but functionally equivalent) way to write:
*string = *s;
string++;
s++;
Upvotes: 0
Reputation: 882266
Not quite. In your original question, ptr
would be set to point to the same first character as hello
, which may not necessarily be h
. You may have done:
char *hello = "goodbye";
in which case both hello
and ptr
will point to that g
. However your edit now makes it clear that you meant:
char *hello = "hello";
Your comment on ptr++
is correct. It will move ptr
so that it points to the next character and, as per C string handling convention, '\0'
marks the end of the string.
The statement:
*string++ = *s++;
is something you often see in string copying code (copying s
to string
), something like:
char *mystrcpy (char *d, char *s) {
char *d2 = d;
while (*s != '\0')
*d2++ = *s++;
*d2 = '\0';
return d;
}
In this case, the line *d2++ = *s++;
means:
s
to the memory location d2
.d2
to point to the next destination character.s
to point to the next source character.In other words,
*string++ = *s++;
is functionally identical to:
*string = *s;
string++;
s++;
Upvotes: 4
Reputation: 838946
so why would we want to do *string(which gets a value) - and combine it with ++
When *string
is on the left hand side of the equals, it doesn't get the value, it sets the value.
The statement *string++ = *s++;
is equivalent to:
*string = *s;
s++;
string++;
This is because x++
is the postfix increment operator (as opposed to ++x
which is the prefix increment operator). The pointer x is updated but the value that x
was originally pointing to is used in the expression.
Personally I'd say that the one-liner is more confusing to read and you should generally try to avoid complex expressions with side-effects. But in this case it's a fairly standard idiom in C, so you might as well get used to it.
Upvotes: 1
Reputation: 523614
then ptr will be pointing at h, correct?
Yes. No. See @paxdiablo's answer.
*string++ = *s++;
This statement can be viewed as
*string = *s;
string ++;
s ++;
That means:
s
to the location pointed by string
.s
and string
to the next character.Upvotes: 0