I'm interested in What is the difference between (int)a
and *(int*)&a
. They have different outputs.

- 117,907
- 20
- 175
- 238

- 1
- 1
-
Note this site uses markdown. If you delimit code with backticks ("`"), it will be formatted as code. Otherwise, certain characters (such as asterisks) are interpreted as formatting. Read the formatting help (accessible when posting and the help center) for more. – outis Jan 30 '21 at 10:19
-
4What's the *type* of `a`? Can you post [mcve]? – P.P Jan 30 '21 at 10:23
-
the type of 'a' is a float – user15111237 Jan 30 '21 at 10:27
-
1In addition to complete code, sample input and output/results (if any) should be included, including both expected/desired results and actual (if the two are different). Clarifications should be edited into the question. – outis Jan 30 '21 at 10:28
-
Casting a `float*` to `int*` and reading as if it's an `int` object isn't allowed - `*(int*)&a` is undefined behaviour. – P.P Jan 30 '21 at 10:29
-
2Does this answer your question? "[Dereferencing the address of a pointer-casted variable](https://stackoverflow.com/q/56074903/90527)", "[What does i = * ( long * ) &y; do?](https://stackoverflow.com/q/47946741/90527)", "[Why cast to a pointer then dereference?](https://stackoverflow.com/q/39312058/90527)" – outis Jan 30 '21 at 10:32
1 Answers
There is a big difference between the two expressions.
In this expression
(int)a
the value of the object a
is converted to an integer value of the type int.
In this expression
*(int*)&a
the sub-expression (int*)&a
says the compiler that there is allocated memory for an object of the type int
that is that in the memory there is indeed stored a valid object of the type int. However the initial memory extent allocated for the object can be larger than an extent that stores a valid object of the type int
or there can be stored not an object of the type int
and as a result dereferencing the pointer can result in undefined behavior.
That is using the first expression the compiler tries to convert a value to a value of the type int
while in the second case the compiler tries to interpret an extent of memory as it stores a valid object of the type int
.
Here is a demonstrative program.
#include <stdio.h>
int main(void)
{
double x = 1.5;
printf( "%d\n", ( int )x );
printf( "%d\n", *( int *)&x );
return 0;
}
Its output is
1
0
And another example when using an expression like this *(int*)&a
can produce a valid code and result.
#include <stdio.h>
int main(void)
{
struct A
{
int x;
int y;
} a = { .x = 10, .y = 20 };
printf( "%d\n", *( int *)&a );
return 0;
}
The program output is
10

- 301,070
- 26
- 186
- 335
-
But here the double type is casted with int* , the size of int and the size of double are different , but the sizes of float and integer are the same , aren't they? – user15111237 Jan 30 '21 at 10:47
-
@user15111237 But the representations are different. I wrote about this "or there can be stored not an object of the type int" – Vlad from Moscow Jan 30 '21 at 10:50
-