c中常量指针的类型转换

c中常量指针的类型转换,c,pointers,casting,C,Pointers,Casting,我试图运行此代码,但编译器返回以下警告: int c=23; int *const a=&c; printf("%d",(int)a); 警告:从指针转换为不同大小的整数[-Wpointer到int cast] 您已将a声明为常量指针,但正在尝试将其打印为int。使用%p说明符打印指针地址并将指针强制转换为void,如下所示: printf ("%p", ( void * ) a); 您将收到一条警告,因为在类型不匹配之后,编译器必须将其转换为打印,并且信息将丢失 如果要打印指针的物

我试图运行此代码,但编译器返回以下警告:

int c=23;
int *const a=&c;
printf("%d",(int)a);
警告:从指针转换为不同大小的整数
[-Wpointer到int cast]


您已将
a
声明为常量指针,但正在尝试将其打印为
int
。使用
%p
说明符打印指针地址并将指针强制转换为void,如下所示:

printf ("%p", ( void * ) a);

您将收到一条警告,因为在类型不匹配之后,编译器必须将其转换为打印,并且信息将丢失

如果要打印指针的物理地址,请使用
%p
并将指针强制转换为
void*

printf("%p", (void *) a);
如果要打印指针(指针所指向的)的内容,必须取消对其的引用:

printf("%d", *a);

请记住,要访问内容,请使用
*
。否则,您将使用指针,而不是其内容。要获取非指针变量的地址:
&

c表示内存中的地址,它是整数的第一个字节,在本例中是数字23 a表示内存中的另一个地址,它是指针的第一个字节——在本例中,它包含c的地址(不是c中的值,因为您使用了&c,它表示它的地址)

要以有意义的方式打印a,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到int cast]
因为您正在为指针“a”使用正确的格式说明符,但您已将其强制转换为整数类型。虽然int和指针都是“整数”,但它们是大小不同的整数。
如果忽略警告并运行代码,则打印的值不正确,但可以看到它已被截断:
0x80a3f24是指向int的常量指针,它是一个警告,而不是错误。但是,问题是-您试图实现什么?您的问题是什么?如果必须,则强制转换指针类型的正确整数类型是
uintpr\t
intptr\t
。但是,由于您似乎更多地处于C体验的开始阶段,因此尽量避免使用强制转换。
printf("%p\n", (int) a);