1.第一个程序
void main()
{
int x=30;
printf("%d",printf("%d",x))
}
2.第二个计划
void main()
{
char *x="abcdef";
x++;
printf("%s",x);
}
我需要知道这段代码是如何工作的 第一个代码的输出是302 第二个代码是bcdf 字符指针如何排序字符串的地址
答案 0 :(得分:2)
首先必须纠正第一个代码
#include <stdio.h>
int main(void)
{
int x=30;
printf("%d\n",printf("%d",x));
}
此代码打印302
由于:
30
外部printf打印嵌套printf的返回值,即 2
。正如the man所说
返回值
成功返回后,这些函数返回打印的字符数(不包括用于结束输出到字符串的空字节)。
必须更正的第二个代码:
#include <stdio.h>
int main(void)
{
char *x="abcdef";
x++;
printf("%s\n",x);
}
过于简单无法解释,你应该看看一本好的C书并研究一些有关指针的内容。
修改强>
OP评论答案后:
"%s"
格式说明符打印指针指向的字符串。如果要打印指针地址,则必须使用"%p"
格式说明符。所以:
printf("%p\n", (void *)x);
查看the man:
<强>取值强>
如果不存在l修饰符:const char *参数应该是指向字符类型数组(指向字符串的指针)的指针。数组中的字符被写入(但不包括)终止空字节(&#39; \ 0&#39;);如果指定了精度,则不会写入指定的数量。如果给出精度,则不需要存在空字节;如果未指定精度,或者大于数组的大小,则数组必须包含终止空字节。
如果存在l修饰符:const wchar_t *参数应该是指向宽字符数组的指针。数组中的宽字符将转换为多字节字符(每个字符都通过调用wcrtomb(3)函数,转换状态从第一个宽字符之前的初始状态开始),直到并包括终止空宽字符。生成的多字节字符被写入(但不包括)终止空字节。如果指定了精度,则不会写入比指定数字更多的字节,但不会写入部分多字节字符。请注意,精度决定了写入的字节数,而不是宽字符数或屏幕位置数。该数组必须包含一个终止的空宽字符,除非给出一个精度,并且它太小,以至于在到达数组结束之前写入的字节数超过它。
<强> P 强>
void * pointer参数以十六进制打印(就像通过%#x或%#lx一样)。
答案 1 :(得分:1)
这是一个非常基本的行为。对于第一个程序,将评估嵌套的printf。因此,计算机将在屏幕上打印30
。如果您查看printf()的手册页,您会看到printf()
函数返回屏幕上打印的字符数。此返回值用作外部printf()
调用的参数,该调用也会打印在屏幕上,这就是您看到302
的原因。
第二个例子只是一些指针算法。 char *x= "abcdef";
定义一个指向字符串的指针(以NULL结尾的字符数组)。所以x
指向数组的第一个元素(你的字符数组)。该数组的每个元素都是大小为1字节的char
。因此,如果您增加x
,您的计算机将向其地址添加数组元素的大小(此处为1个字节),您将指向第二个元素。这就是您打印bcdf
。
答案 2 :(得分:0)
printf
返回写入的字符数。因此,它打印“30”(因为你打印x
)然后打印“2”(因为它写了2个字符)。如果在每个printf
中添加“\ n”,您会发现不同。
当x
是指针时,执行x++
会增加指向的地址。当你在一个数组中时,你将转移到数组的下一个单元格。由于字符串是char
的数组,x+1
将指向字符串的第二个字符(此处为“b”)。打印字符串时,打印每个字符直到结束,从x
指向的字符开始。这就是你打印“bcdef”的原因:它从x+1
开始打印每个角色。