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 |
+---+---+---+---+---+---+---+---+---+---+