我正在学习指针,并且我从教程中运行了这个程序,它提供了一些有趣的输出。
#include <stdio.h>
int main () {
int var = 20; /*actual variable declaration */
int *ip; /*pointer variable declaration*/
ip = &var; /*store addres of var in ip variable*/
printf("Address of var variable: %x\n", &var);
/*address stored in ip variable*/
printf("Address of stored in ip variable: %x\n", ip);
/*access the value using pointer */
printf("value of *ip variable: %x\n", *ip);
return 0;
}
根据我的理解,该网站说我的输出应该是两个匹配的内存位置,而值为*的* ip变量&#34;部分。我对内存位置没有任何问题,它们都像人们想象的一样,最后一部分,它告诉我* ip变量的值是14?
Address of var variable: 6d73b8cc
Address of stored in ip variable: 6d73b8cc
value of *ip variable: 14
这是怎么回事?用gcc编译,它给出一个关于格式%x的警告,期望一个无符号整数,但参数2的类型为....
MorePointers.c:10:9: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat=]
printf("Address of var variable: %x\n", &var);
^
MorePointers.c:13:9: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat=]
printf("Address of stored in ip variable: %x\n", ip);
请纠正我,如果我错了,但可能是由于格式,当期望无符号整数时可能导致数字不是20?作为无符号整数的值在0到65,535或0到4,294,967,295之间,而整数在-32,768到32,767或-2,147,483,648到2,147,483,647之间?
答案 0 :(得分:10)
发生的事情是您将整数值20
打印为十六进制值,正确显示为14
。我怀疑你期待20
十进制。 :)
答案 1 :(得分:5)
一些修正: -
printf("Address of var variable: %x\n", &var);
这是不正确的,指针应该打印为指针值
printf("Address of var variable: %p\n", &var); /* << ensure pointer value */
当您致电printf
时,它会将固定文字与参数按顺序混合......
printf( "hello %d world %d today %d\n", 1,2,3 );
今天打印你好1世界2 3
显示参数的方式基于格式说明符。
%s /* displays as a string */
%d /* displays as an integer in normal decimal */
%x /* displays an integer in hexa-decimal. */
%f /* displays as a floating point */
%p /* displays a pointer address */
Decimal goes 0,1,2,..,8,9,10,11,...,14,15,16,17,...,20
Hexadecimal goes 0,1,2,..,8,9, A, B,..., E, F,10,11,...,14
答案 2 :(得分:4)
您正在打印Apartment
或var
的十六进制值,即*ip
。
使用0x14
作为十进制值。
答案 3 :(得分:2)
前两个printf()
语句具有未定义的行为,因为%x
要求相应的参数为unsigned类型,而不是指针。因此警告。如果要打印指针的值(并将指针转换为%p
以使用它),请查找(void *)
格式。
%x
以十六进制格式打印基数16.十六进制的20
(十进制)值为14
(1*16 + 4
)。严格来说,您应该将int
转换为unsigned
以使用%x
。
答案 4 :(得分:1)
如果编译时启用了所有警告(对于gcc,至少使用:-Wall -Wextra -pedantic
)
然后编译器会告诉你,对于第10行和第13行:
warning: format: '%x' expects argument of type 'unsigned int', but argument two has type 'int*' [-Wformat=]`
对printf()的最后一次调用是传递一种'int',但'%x'期望一个unsigned int。
建议将'ip'和'var'声明为unsigned int
而不是int
或将最后一个printf()更改为:
printf("value of *ip variable: %d\n", *ip);
你可以阅读。在
中了解printf()的格式说明符<http://www.codingunit.com/printf-format-specifiers-format-conversions-and-formatted-output>
或阅读printf
手册页