【问题标题】:%p Format specifier in c%p c 中的格式说明符
【发布时间】:2012-09-19 22:17:30
【问题描述】:

说明符 %p%Fp 在以下代码中如何工作?

void main() 
{
    int i=85;

    printf("%p %Fp",i,i);

    getch();   
}

我得到了0000000000000055 0000000000000055的o/p

【问题讨论】:

    标签: c format-specifiers


    【解决方案1】:

    %p 用于打印地址,但您需要在i 之前使用ampersand& 运算符来获取i 的地址

    所以要获取变量i的地址,正确的格式是:

    void main() 
    {
        int i=85;
    
        printf("%p %Fp", &i, &i);
    
        getch();   
    }
    

    如果你不使用&,那么你只会得到i中包含的值,在这种情况下是8555(十六进制)

    【讨论】:

    • %F 需要 double,而不是指针,因此您的代码与原始代码一样是未定义的行为。
    【解决方案2】:

    除了@Myforwik 所说的

    %p 用于打印指针地址。

    %Fp 可能用于格式化 FAR 指针,其格式为 --> (0x1234:0x5678)

    十进制的 85 是十六进制的 55。

    我希望现在没事。

    参考资料: http://www.lix.polytechnique.fr/~liberti/public/computing/prog/c/C/FUNCTIONS/format.html http://www.winehq.org/pipermail/wine-devel/2005-March/034390.html

    【讨论】:

      【解决方案3】:

      它的目的是以实现定义的格式打印指针值。对应的参数必须是 void * 值。

      %p 用于打印指针的地址,地址取决于我们的系统位。

      【讨论】:

        【解决方案4】:

        这是我机器的编译输出:

        format.c:7:5:警告:格式“%p”需要“void *”类型的参数,但参数 2 的类型为“int”[-Wformat]

        format.c:7:5:警告:格式“%F”需要“double”类型的参数,但参数 3 的类型为“int”[-Wformat]

        所以有警告但它确实编译并且输出是: 0x55 0.000000p

        我很惊讶你最后没有得到一个 p。你确定代码和输出匹配吗?我想 i 的地址也不是不可能的 0x0...055..但是这里看起来有问题。

        btw: %p 的典型用法是打印地址,即 &i 而不是 int

        【讨论】:

          【解决方案5】:

          如果这是您的要求,%p 和 %Fp 会打印出一个指针,特别是指针所指的地址,并且由于它打印出您计算机体系结构的一部分,因此它会以十六进制形式打印。

          在 C 中,您可以在指针和 int 之间进行转换,因为指针只是一个 32 位或 64 位数字(取决于机器架构),指的是上述内存块。

          当然,十六进制的 55 是十进制的 85。

          【讨论】:

          • %Fp 不适用于指针,具体取决于编译器。对于 gcc/clang,%F 用于浮点数,类似于 %f 有一点差异。以下p 将被视为普通字符进行打印。
          • 嗯,那为什么他得到 000.... 55 两次而没有 p? (我同意你的观点,因为我只是自己运行的)
          【解决方案6】:

          %p 用于打印指针地址。

          十进制的 85 是十六进制的 55。

          你的系统指针是 64 位的,所以完整的十六进制表示是:0000000000000055

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-02-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-07-01
            • 1970-01-01
            相关资源
            最近更新 更多