2016-03-28 114 views
-1

我试图运行这段代码,但是编译器返回以下警告:类型转换为常量指针

int c=23; 
int *const a=&c; 
printf("%d",(int)a); 

警告:投从指针不同大小的整数[-Wpointer-to-int-cast]

printf("%d",(int)a); 
+0

'了'是一个常量指针为int,这是一个警告,不是一个错误。但是,问题是 - 你想达到什么目的? –

+0

你的问题是什么? –

+0

如果你必须,正确的整型指针类型是'uintptr_t'和'intptr_t'。但是,因为你似乎更多地处在C经历的开始阶段,所以尽量避免演员阵容。 –

回答

0

您已声明a作为常量指针,但您试图将其打印为int。使用%p符,以打印指针的地址,并投出您的指针为void,就像这样:

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

,您会收到警告,因为类型不匹配后,编译器必须将其转换为打印和信息迷路了。

如果你想打印指针的物理地址,使用%p和转换指针到void *

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

如果你想打印指针的内容(到它的指向),则必须取消对它的引用:

printf("%d", *a); 

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

0

c表示存储器中的一个地址,它是整数的第一个字节 - 在这种情况下,编号23 a代表存储器中另一个地址,它是指针的第一个字节 - 在这种情况下,保存地址c(不是在C值,因为你使用&ç这意味着它的地址)

打印出的meaningfull方式的printf如果你使用这四个printf语句必须使用指针格式%p

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

相关问题