我试图运行这段代码,但是编译器返回以下警告:类型转换为常量指针
int c=23;
int *const a=&c;
printf("%d",(int)a);
警告:投从指针不同大小的整数
[-Wpointer-to-int-cast]
printf("%d",(int)a);
我试图运行这段代码,但是编译器返回以下警告:类型转换为常量指针
int c=23;
int *const a=&c;
printf("%d",(int)a);
警告:投从指针不同大小的整数
[-Wpointer-to-int-cast]
printf("%d",(int)a);
您已声明a
作为常量指针,但您试图将其打印为int
。使用%p
符,以打印指针的地址,并投出您的指针为void,就像这样:
printf ("%p", (void *) a);
,您会收到警告,因为类型不匹配后,编译器必须将其转换为打印和信息迷路了。
如果你想打印指针的物理地址,使用%p
和转换指针到void *
:
printf("%p", (void *) a);
如果你想打印指针的内容(到它的指向),则必须取消对它的引用:
printf("%d", *a);
记住,访问内容,使用*
。否则,你使用指针而不是其内容。获取非指针变量的地址:&
。
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
'了'是一个常量指针为int,这是一个警告,不是一个错误。但是,问题是 - 你想达到什么目的? –
你的问题是什么? –
如果你必须,正确的整型指针类型是'uintptr_t'和'intptr_t'。但是,因为你似乎更多地处在C经历的开始阶段,所以尽量避免演员阵容。 –