Первый: указатели должны быть приведены к (void*)
и напечатаны с %p
. %d
печатает int
в базе 10. То есть
#include <stdio.h>
int main(){
int i;
int *p = (int*) i;
printf("\n p is %p ", (void*)p);
int *q = &i;
printf("\n q is %p ", (void*)q);
}
Теперь попробуем скомпилировать программу с этими изменениями: только 2 ошибки:
% gcc ptr.c -Wall -Wextra
ptr.c: In function ‘main’:
ptr.c:5:14: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
int *p = (int*) i;
^
ptr.c:5:14: warning: ‘i’ is used uninitialized in this function [-Wuninitialized]
int *p = (int*) i;
^~~~~~~~
Оба имеют отношение к int *p = (int*) i;
; второй говорит, что используется значение i
, но мы не установили никакого значения на i
(это вызывает неопределенное поведение ), а другое - что мы пытаемся преобразовать целое число в указатель, и целое число не имеет такого же количества бит, как указатель на этой платформе.
1018 * Т.е. *
int *q = &i;
инициализирует указатель на int q
с адресом переменной i
, тогда как
int *p = (int*) i;
интерпретирует значение мусора, содержащееся в i
, в соответствии с реализацией, как адрес, и инициализирует p
этим.
Не совсем равный.