以下代码在C中的输出是什么?

以下代码在C中的输出是什么?,c,string,pointers,character,C,String,Pointers,Character,请看一下这个代码 #include <stdio.h> int main() { char *p; p = "%d"; p++; p++; printf(p-2,23); return 0; } #包括 int main() { char*p; p=“%d”; p++; p++; printf(p-2,23); 返回0; } 我有以下问题 1) 指向字符数据类型的指针如何能保存字符串数据类型? 2) 当p增加两倍时会发生什么?

请看一下这个代码

 #include <stdio.h>

int main()
{
    char *p;
    p = "%d";
    p++;
    p++;
    printf(p-2,23);
    return 0;
}
#包括
int main()
{
char*p;
p=“%d”;
p++;
p++;
printf(p-2,23);
返回0;
}
我有以下问题

1) 指向字符数据类型的指针如何能保存字符串数据类型? 2) 当p增加两倍时会发生什么?
3) 在没有明显的引号的情况下,
printf()
如何打印字符串?

下面解释了发布代码中的每条语句:

 #include <stdio.h>// include the header file that has the prototype for 'printf()'

int main( void )   // correct signature of 'main' function
{
    char *p;       // declare a pointer to char, do not initialize
    p = "%d";      // assign address of string to pointer
    p++;           // increment pointer (so points to second char in string
    p++;           // increment pointer (so points to third char in string
    printf(p-2,23);// use string as 'format string' in print statement, 
                   // and pass a parameter of 23
    return 0;      // exit the program, returning 0 to the OS
}
#include//包含包含“printf()原型”的头文件
int main(void)//正确签名'main'函数
{
char*p;//声明指向char的指针,不初始化
p=“%d”//将字符串地址分配给指针
p++;//增量指针(因此指向字符串中的第二个字符
p++;//增量指针(因此指向字符串中的第三个字符
printf(p-2,23);//在print语句中使用字符串作为“格式字符串”,
//并传递参数23
return 0;//退出程序,将0返回操作系统
}
1)指向字符数据类型的指针如何保存字符串数据类型

Ans:String不是C中的基本数据类型。String只是在遇到“\0”之前在内存中连续放置的字符

2) 当p增加两倍时会发生什么

Ans:它现在指向“\0”字符

3) 如果没有使用明显的引号,printf()如何打印字符串


答:字符串总是用引号表示,因此不需要额外的引号。

1。指向字符数据类型的指针如何保存字符串数据类型?

->
字符指针
将保存
字符数据类型
的地址,因为
字符串
字符数据类型
的集合。因此,
char
指针
可以保存
字符串
数据类型

2。当
p
增加两次时会发生什么情况?

->当您将
char
指针
指定给
字符串
时,指针将指向第一个字符。因此,当您将指针递增两次时,它将保留第三个字符的地址,在您的情况下,它是“\0”

3。如果没有使用明显的引号,printf()如何打印字符串

->
printf(p-2,23)
使用字符串作为格式标识符在您的例子中是
“%d”

“指向字符数据类型的指针如何能够容纳字符串数据类型?”在C中,类型“指向字符的指针”是字符串类型,这在一定程度上是正确的。任何对字符串(包括
printf
)进行操作的函数都可以通过
char*
类型的参数来接受这些字符串

“当没有明显的引号时,
printf()
如何打印字符串?”没有规则说需要引号才能打印字符串!带引号的东西是字符串常量或字符串文字,这是将字符串输入程序的一种方法,但它并不是唯一的方法。有很多方法可以构造(操作和修改)完全不包含引号的字符串

让我们画一些代表代码的图片:

char *p;
p
是指向
char
的指针,但正如您正确指出的,它还没有指向任何地方。我们可以这样用图形表示它:

   +-----------+
p: |    ???    |
   +-----------+
接下来,将
p
设置为指向某个地方:

p = "%d";
这会将字符串
%d”
分配到某个地方(无论在哪里),并将
p
设置为指向该字符串:

   +---+---+---+
   | % | d |\0 |
   +---+---+---+
     ^
     |
      \
       \
        \
         |
   +-----|-----+
p: |     *     |
   +-----------+
接下来,开始递增
p

p++;
正如您所说的,这使得
p
指向字符串的第二个字符:

   +---+---+---+
   | % | d |\0 |
   +---+---+---+
         ^
         |
         |
         |
         |
         |
   +-----|-----+
p: |     *     |
   +-----------+
         +---+---+---+
         | % | d |\0 |
         +---+---+---+
           ^       ^
      +----|----+  |
 p-2: |    *    | /
      +---------+/
                /
               |
         +-----|-----+
      p: |     *     |
         +-----------+
其次,

现在我们有:

   +---+---+---+
   | % | d |\0 |
   +---+---+---+
             ^
             |
            /
           /
          /
         |
   +-----|-----+
p: |     *     |
   +-----------+
接下来您调用了
printf
,但有点奇怪:

printf(p-2,23);
关键是表达式
p-2
。如果
p
指向字符串中的第三个字符,则
p-2
指向字符串中的第一个字符:

   +---+---+---+
   | % | d |\0 |
   +---+---+---+
         ^
         |
         |
         |
         |
         |
   +-----|-----+
p: |     *     |
   +-----------+
         +---+---+---+
         | % | d |\0 |
         +---+---+---+
           ^       ^
      +----|----+  |
 p-2: |    *    | /
      +---------+/
                /
               |
         +-----|-----+
      p: |     *     |
         +-----------+
而这个指针,
p-2
,或多或少就是
printf
收到的指针,如果你更习惯地称之为
printf(“%d”,23)

现在,如果您认为
printf
收到了一个字符串,那么听到
printf
很高兴收到一个
char*
而实际上它总是收到一个
char*
,您可能会感到惊讶。如果这是令人惊讶的,问问你自己,如果不是指向
char
的指针,你收到了什么东西
printf

严格来说,C中的字符串是一个字符数组(以
'\0'
字符结尾)。但是关于C有一个非常重要的秘密事实,如果你还没有遇到它,你很快就会发现(因为它根本不是秘密):

在C语言中,你不能对数组做太多的事情。每当你在C语言中的表达式中提到一个数组时,每当你试图对数组的值做些什么时,你会得到一个指向数组第一个元素的指针

该指针几乎就是数组的“值”。由于指针算法的工作方式,您可以使用指针以非常透明的方式访问数组(几乎就像指针是数组一样,但当然不是)。这一切也完全适用于字符数组(以及指向字符的指针)

因为C中的字符串是一个字符数组,所以当您编写

"%d"
printf("%d", 23);
这是一个由三个字符组成的数组。但是当你在表达式中使用它时,你得到的是一个指向数组的指针;这是第一个要素。例如,如果你写

"%d"
printf("%d", 23);
您有一个字符数组,并且在表达式中提到它,因此您得到的是指向数组的第一个元素的指针,这就是传递给
printf
的内容

如果我们说

char *p = "%d";
printf(p, 23);
我们已经完成了任务