Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在printf中获取字符串的基址?此o/p的原因是什么?_C_Printf - Fatal编程技术网

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

C 如何在printf中获取字符串的基址?此o/p的原因是什么?,c,printf,C,Printf,下面是代码…我想知道它实际上是如何工作的,即为什么输出是这样的 { printf(5 + "GeeksQuiz"); return 0; } 输出:测验该行为归因于指针运算“Geeksquick”的类型为char[10](即9个字符加上结尾的\0空字符),表达式5+“Geeksquick”返回指向“Geeksquick”第六个元素的指针(即和(char[5]))。因此,printf打印“测验” 好的,让我们更仔细地看看我们有什么: printf(5 + "GeeksQuiz");

下面是代码…我想知道它实际上是如何工作的,即为什么输出是这样的

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

输出:测验

该行为归因于指针运算<代码>“Geeksquick”的类型为
char[10]
(即9个字符加上结尾的
\0
空字符),表达式
5+“Geeksquick”
返回指向“Geeksquick”第六个元素的指针(即
和(char[5])
)。因此,
printf
打印
“测验”

好的,让我们更仔细地看看我们有什么:

printf(5 + "GeeksQuiz");
格式字符串——必须是
“geeksquick”
开始并在其初始换档状态结束——这必须是5;当每个转换规范由字符
%
引入,并以
转换规范
结尾时,我看不到任何以
%
引入的内容,因此字符串中一定没有转换规范

因此,我们有
printf
,格式字符串
“geeksquick”
,初始移位状态
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停在
man3printf
上,我们确切地了解了
printf(5+“geeksquick”)是,以及它为什么这样做。

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

这里字符串“geeksquick”衰减为指向其第一个元素的指针,或者被解释为指向字符串的指针。如果这是一个简单的陈述,比如

    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将从0开始的字符串中的第5个字符打印字符串,即“Q”

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

因此,输出“quick”

字符串文字
“geeksquick”
的类型为
char[]

在C语言中,字符串文字的类型为char[],…“[]

但是,此字符串文字左值隐式转换为指向char的指针类型为
的prvalue:

“类型为“N T数组”或“T的未知边界数组”的左值或右值可以隐式转换为类型为“指向T的指针”的PR值。生成的指针引用数组的第一个元素。”[]

其余的应该是不言自明的,我将引用402的回答来获得完整的答案:


这种行为归因于指针运算。“Geeksquick”的类型为char[10](即9个字符加上结尾处的\0空字符),表达式5+“Geeksquick”返回指向“Geeksquick”的第六个元素的指针(即,&(char[5])。因此,printf打印“测验”。[]


我敦促您自己去解决这个问题,即使您必须在这个过程中学习C指针算法。在StActOp溢出上发布这个问题,你会错过很多乐趣。“PaulKeister-OK…下次我会在STACKOPPORT……发布之前自己尝试一下。)C字符串文字不是<代码> const 。@ KeththpPsPon是的,明显与C++混淆,请您欢迎。当我有问题时,我很高兴有比我更聪明的人帮助我。(仍然是上午)
    printf(5 + "GeeksQuiz");   OR
    printf("GeeksQuiz" + 5);
      0   1   2   3   4   5   6   7   8   9      
    +---+---+---+---+---+---+---+---+---+---+
    | G | e | e | k | s | Q | u | i | z | 0 |
    +---+---+---+---+---+---+---+---+---+---+