У меня есть значение «unsigned int *», и мне нужно преобразовать его в простое «unsigned int»,
чтобы я мог передать его в функцию. Но, к сожалению,
когда я пытаюсь сделать простое приведение, значение меняется:
Code:
unsigned int * addr;
...
fprintf(stdout, "=== addr: %08x ===\n", addr); fflush(stdout);
fprintf(stdout, "=== casted addr: %08x ===\n", (unsigned int)addr);Output:
=== addr: fc880000 ===
=== casted addr: 400eff20 ===
Скажите, пожалуйста, как правильно преобразовать это значение, чтобы оно не менялось во время преобразования?
Просто использовать *addr
, Это действительно и всегда должно работать. В случае, если вам нужно получить значение указателя вместо значения указал на по указателю вам понадобится больший тип. Как правило, значение unsigned int*
64 бит, в то время как unsigned int
только 32 бит.
Когда вы объявляете указатель, как
unsigned int * addr;
Значение этого указателя будет адресом unsigned int
это указывает на.
Когда вы хотите получить значение unsigned int
это указывает на то, что вы используете оператор разыменования *
:
unsigned int value = *addr;
Итак, что вы видите во второй строке вывода, это содержимое того, что addr
указывает на.
Если у вас есть указатель какого-либо типа, и вам нужно преобразовать его только в тип, вам просто нужно указать указатель на другом месте.
void foo(unsigned int some_value);
...
int main()
{
unsigned int * addr = 0x12345678; // some address holding an unsigned int
foo(*addr); // some function taking a unsigned int
Не нужно ничего вводить здесь, потому что вы не меняете тип. Обратите внимание, что в вашем коде «значение» не меняется:
// prints the address
fprintf(stdout, "=== addr: %08x ===\n", addr);
// prints the value at that address
fprintf(stdout, "=== casted addr: %08x ===\n", *(unsigned int *)addr);
Вы не меняете значение. В
fprintf(stdout, "=== addr: %08x ===\n", addr); fflush(stdout);
Вы получаете доступ к адресу указателя.
В
fprintf(stdout, "=== casted addr: %08x ===\n", *(unsigned int *)address);
Вы получаете доступ к указанному значению.