Я только начал изучать C. Я думаю, что я сделал что-то не так с указателем здесь или не понял смысла этого. Посмотрите:
#include <stdio.h>
union Uniao{
int i;
float f;
char c[4];
};
void test(union Uniao *uniao);
int main(){
union Uniao uniao;
printf("uniao.i: %x\n"
"uniao.f: %x\n"
"uniao.c: %x\n",
&uniao.i, &uniao.f,&uniao.c);
test(&uniao);
}
void test(union Uniao *uniao){
printf("uniao.i: %x\n"
"uniao.f: %x\n"
"uniao.c: %x\n",
uniao->i, uniao->f,uniao->c);
}
Как я понял, указатель указывает на расположение памяти исходной переменной. Таким образом, вывод с использованием указателя должен совпадать с выходом с использованием исходной переменной. Но мой результат выглядит примерно так:
uniao.i: bfeac1dc
uniao.f: bfeac1dc
uniao.c: bfeac1dc
uniao.i: b77abff4
uniao.f: 80000000
uniao.c: beef57fe
Что-то не так с моим указателем, или я его неправильно понял?
В первом случае вы печатаете адрес каждого члена союза. Будучи членами союза, все они имеют одинаковый адрес. Внутри функции вы печатаете значения элементов. (Что, имея разные типы, приведет к нечетным результатам здесь.) Добавление &
перед каждым unaio во втором вызове printf даст вам ожидаемые результаты.
Включите предупреждения на своем компиляторе, чтобы он рассказывал вам, что он думает о вашем коде. Он должен найти около шести или около того плохих ошибок.
В вашем первом заявлении printf в основном вы используете "&", который возвращает адрес каждого члена (все должно быть одинаковым для объединения), но в функции "Тест" вы передаете значения каждого члена союза по адресам, т.е. &". Вот почему вы получаете разные выходные значения.
main()
форматирует адреса памяти членов профсоюза, тогда как test()
вместо этого форматирует значения членов.