我正在尝试运行此代码,但编译器会返回以下警告:
int c=23;
int *const a=&c;
printf("%d",(int)a);
警告:从指针强制转换为不同大小的整数
[-Wpointer-to-int-cast]
printf("%d",(int)a);
答案 0 :(得分:0)
您已将a
声明为常量指针,但您尝试将其打印为int
。使用%p
说明符打印指针的地址并将指针转换为void,如下所示:
printf ("%p", ( void * ) a);
答案 1 :(得分:0)
您收到警告,因为在类型不匹配后,编译器必须将其转换为打印它并且信息将丢失。
如果要打印指针的物理地址,请使用%p
并将指针强制转换为void *
:
printf("%p", (void *) a);
如果要打印指针的内容(指向它的内容),则必须取消引用它:
printf("%d", *a);
请记住,要访问内容,请使用*
。否则,您使用指针,而不是其内容。获取非指针变量的地址:&
。
答案 2 :(得分:0)
c表示内存中的地址,它是整数的第一个字节 - 在本例中为数字23 a表示内存中的另一个地址,它是指针的第一个字节 - 在这种情况下保存c的地址(不是c中的值,因为你使用了& c表示其地址)
要以有意义的方式打印出来,printf必须使用指针格式%p
如果你使用这四个printf语句:
printf("%p\n", a);
printf("%p\n", &c);
printf("%d\n", *a);
printf("%d\n", c);
你会得到这样的东西:
0x7ffc080a3f24 ('a' contains a pointer which is the address of 'c')
0x7ffc080a3f24 (&c is the address of 'c')
23 (*a, dereferencing the pointer contained in 'a' provides the value held by the address held by 'a')
23 (and 'c' is the value held at the address &c)
请注意,如果您这样做,也会收到警告:
printf("%p\n", (int) a);
警告:从指针强制转换为不同大小的整数[-Wpointer-to-int-cast]
因为您使用了正确的指针格式说明符' a',但您已将其转换为整数类型。虽然int和指针都是'整数'它们是不同大小的整数
如果忽略警告并运行代码,则打印的值不正确,但您可以看到它已被截断:
0x80a3f24