基本程序,有趣的输出?解释

时间:2016-01-02 12:47:26

标签: c pointers

我正在学习指针,并且我从教程中运行了这个程序,它提供了一些有趣的输出。

#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之间?

5 个答案:

答案 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)

您正在打印Apartmentvar的十六进制值,即*ip

使用0x14作为十进制值。

答案 3 :(得分:2)

前两个printf()语句具有未定义的行为,因为%x要求相应的参数为unsigned类型,而不是指针。因此警告。如果要打印指针的值(并将指针转换为%p以使用它),请查找(void *)格式。

%x以十六进制格式打印基数16.十六进制的20(十进制)值为141*16 + 4)。严格来说,您应该将int转换为unsigned以使用%x

答案 4 :(得分:1)

使用printf()的打印地址应该使用'%p'而不是'%x'来完成。

如果编译时启用了所有警告(对于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手册页