Say I have the following problem:
main(void) {
int * p;
int nums [3] = {1,5,9};
char c [3] = {'s','t','u'};
p = nums [2];
*p = (int) *c;
}
What does the last line mean?
Say I have the following problem:
main(void) {
int * p;
int nums [3] = {1,5,9};
char c [3] = {'s','t','u'};
p = nums [2];
*p = (int) *c;
}
What does the last line mean?
Let's break it down: *p = (int) *c;
c
is a char array.
*c
is the first element of the char array, because c[0]
= *(c+0)
= *(c)
= *c
(int) *c
casts the first element of the char array c
to an integer. This is required, because with...
*p = (int) *c
you assign the to an integer casted char to the content of pointer p
.
This code will not work, or will cause problems if it does.
the line; p = nums[2];
sets the value of the pointer p to the value 9. This is not likely a legal value for your pointer. If it were, then the memory location 9 would be set to 115 which is the integer value of 's'.
*c
→ Decay c
to pointer-to-first-element, and access the pointed-to value. Same as c[0]
.
(int) *c
→ cast that value to int
.
*p = (int) *c
→ assign that to what p
points to.
There are many issues in this code, let's address them first.
Firstly, main(void)
is not conforming code. You need to change that to int main(void).
Secondly, p = nums [2];
is wrong. p
is of type int *
, and nums[2]
is of type int
. You may not assign an int
to a int *
and expect something fruitful to happen. Maybe what you meant to write is p = &nums[2];
. Without this modification, going further will invoke undefined behavior as you will try to access a memory location that is invalid to your program.
Then, coming to your question,
*p = (int) *c;
it basically dereference c
NOTE to get the value, then cast it to an int
type and store into the memory location pointed by p
. However, in C
, this casting is not required. The above statement is equivalent to
*p = *c;
anyway.
NOTE: Array name decays to the pointer to the first element of the array, i.e., in this code, using c
is the same as &c[0]
, roughly.