如何在printf中获取字符串的基址?这个o / p的原因是什么?

时间:2014-08-09 05:40:21

标签: c printf

以下是代码...我想知道它实际上是如何工作的,那么为什么输出是这样的呢?

{
   printf(5 + "GeeksQuiz");
   return 0;
}

输出:测验

4 个答案:

答案 0 :(得分:1)

该行为归因于指针算法。 "GeeksQuiz"的类型为char[10](即9个字符加上末尾的\0空字符),表达式5 + "GeeksQuiz"返回指向"的第6个元素的指针。 GeeksQuiz" (即&(char[5]))。因此,printf打印"Quiz"

答案 1 :(得分:1)

#include <stdio.h>

int main (void) {
    printf(5 + "GeeksQuiz");
    return 0;
}

要了解其工作原理,请先从man 3 printf开始。查看相关部分,您会发现:

The  functions  in  the printf() family produce output according to a format 
as described below. ...

The format string is a character string, beginning and ending in its initial 
shift state, if any. ...

Each conversion specification is introduced by the character %, and ends with
a conversion specifier.

好的,让我们看一下我们所拥有的东西:

printf(5 + "GeeksQuiz");

格式字符串 - 必须为"GeeksQuiz"; 开始并以初始班次状态结束 - 必须是 5 ;其中每个转化规范由字符%引入,并以conversion specifier结尾 - 我没有看到任何介绍%所以必须在字符串中没有转换规范。 ...

因此,我们看来printf的{​​{1}}的格式字符串"GeeksQuiz"初始移位状态。这是怎么回事?

5

因此,通过在 GeeksQuiz --------- 012345678 -- 9 characters, character indexes 0-8 --------- --> 12345 -- shift state of 5, that's indexes 0-4 -----Quiz -- leaves us with Quiz 停止 1 ,我们确切地了解了man 3 printf是什么以及它为什么会这样做。

答案 2 :(得分:0)

首先,printf中的内容在编译时被解释,然后才被提取到printf语句。

此处字符串“GeeksQuiz”衰减到指向其第一个元素的指针或被解释为指向字符串的指针。如果它是一个简单的声明,如

    printf("GeeksQuiz");

编译器将返回字符串中第一个元素的地址“G”,printf将打印它直到遇到\ 0。

但在上述情况下

    printf(5 + "GeeksQuiz");   OR
    printf("GeeksQuiz" + 5);

将执行二进制添加“G”和5的地址,生成的新地址将返回到printf。

以下是内存的样子:

      0   1   2   3   4   5   6   7   8   9      
    +---+---+---+---+---+---+---+---+---+---+
    | G | e | e | k | s | Q | u | i | z | 0 |
    +---+---+---+---+---+---+---+---+---+---+

因此你可以这么说,printf会从字符串中的第5个字符开始打印字符串,从0开始,即“Q”,

或它跳过5个字符并打印给定的字符串。

因此输出“测验”。

答案 3 :(得分:0)

字符串文字"GeeksQuiz"的类型为char[]

  

“在C中,字符串文字的类型为char [],...”[string literal]

但是,此字符串文字左值会隐式转换为pointer to char类型的 prvalue

  

“类型为”NT“或”未知T的数组“的左值或右值可以隐式转换为”指向T的指针“的prvalue。结果指针指向数组的第一个元素“。 [Implicit conversions]

其余的应该是不言自明的,我会引用 40两个的回复来得到一个完整的答案:

  

该行为归因于指针算法。 “GeeksQuiz”的类型为char [10](即9个字符加上末尾的\ 0 null字符),表达式5 +“GeeksQuiz”返回指向“GeeksQuiz”的第六个元素的指针(即&amp;(char) [5]))。因此,printf打印“测验”。 [40two's answer]