Ответ 1
То, что у вас есть, является правильным. Конечно, вы увидите, что emp1 и item1 имеют одинаковое значение указателя.
Я хочу сделать что-то, что кажется довольно простым. Я получаю результаты, но проблема в том, что у меня нет способа узнать, верны ли результаты.
Я работаю на C, и у меня есть два указателя; Я хочу напечатать содержимое указателя. Я не хочу разыгрывать указатель, чтобы получить указанное значение, я просто хочу, чтобы указатель хранился.
Я написал следующий код, и мне нужно знать, правильно ли это, а если нет, как я могу его исправить.
/* item one is a parameter and it comes in as: const void* item1 */
const Emp* emp1 = (const Emp*) item1;
printf("\n comp1-> emp1 = %p; item1 = %p \n", emp1, item1 );
Пока я публикую это (и причина, по которой важно, что это правильно), я должен в конечном итоге сделать это для указателя на указатель. То есть:
const Emp** emp1 = (const Emp**) item1;
То, что у вас есть, является правильным. Конечно, вы увидите, что emp1 и item1 имеют одинаковое значение указателя.
Чтобы напечатать адрес в указателе на указатель:
printf("%p",emp1)
разыменовать один раз и распечатать второй адрес:
printf("%p",*emp1)
Вы всегда можете проверить с помощью отладчика, если вы используете Linux ddd
и отображаете память, или просто просто gdb
, вы увидите адрес памяти, чтобы вы могли сравнить со значениями в ваших указателях.
Я считаю, что это было бы самым правильным.
printf("%p", (void *)emp1);
printf("%p", (void *)*emp1);
printf()
- это вариационная функция и должны быть переданы аргументы правильных типов. В стандарте указано, что %p
занимает void *
.
Поскольку вы уже, похоже, решили отобразить основной указательный адрес, вот как бы вы проверили адрес двойного указателя:
char **a;
char *b;
char c = 'H';
b = &c;
a = &b;
Вы можете получить доступ к адресу двойного указателя a
, выполнив:
printf("a points at this memory location: %p", a);
printf("which points at this other memory location: %p", *a);
char c = 'A';
printf("ptr: %p,\t value: %c,\t and also address: %zu",&c, c,&c);
результат:
ptr: 0xbfb4027f, значение: A, а также адрес: 3216245375
Я был в этом положении, особенно с новым оборудованием. Я предлагаю вам написать небольшую ручную свалку. Вы сможете увидеть данные и адреса, на которых они находятся, показаны вместе. Это хорошая практика и доверительный строитель.