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

时间:2018-08-18 14:50:15

标签: c string pointers character

请看一下这段代码。

 #include <stdio.h>

int main()
{
    char *p;
    p = "%d";
    p++;
    p++;
    printf(p-2,23);
    return 0;
}

我有以下问题

1)指向字符数据类型的指针如何保存字符串数据类型? 2)当p递增两次时会发生什么? 3)如果不使用引号,printf()如何打印字符串?

4 个答案:

答案 0 :(得分:0)

以下说明了已发布代码中的每个语句:

 #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
}

答案 1 :(得分:0)

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

答案:字符串不是C语言中的基本数据类型。字符串不过是char在内存中的连续放置,直到遇到'\ 0'为止。

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

回答:现在指向“ \ 0”字符。

3)当不使用明显的引号时,printf()如何打印字符串

回答:字符串始终用引号表示,因此不需要多余的引号。

答案 2 :(得分:0)

“指向字符数据类型的指针如何容纳字符串数据类型?”好吧,在C中,部分地输入'char的指针'是字符串类型。将发现通过printf类型的参数对字符串(包括char *)进行操作的任何函数都可以接受这些字符串。

“在不使用明显的引号的情况下,printf()如何打印字符串?”没有规则说您需要引号来包含字符串!带引号的东西是字符串常量字符串文字,这是将字符串添加到程序中的一种方法,但这不是唯一的方法。有很多方法可以构造(以及操纵和修改)根本不包含任何引号的字符串。

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

char *p;

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

   +-----------+
p: |    ???    |
   +-----------+

接下来,您将p设置为指向某处:

p = "%d";

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

   +---+---+---+
   | % | d |\0 |
   +---+---+---+
     ^
     |
      \
       \
        \
         |
   +-----|-----+
p: |     *     |
   +-----------+

接下来,您开始递增p

p++;

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

   +---+---+---+
   | % | d |\0 |
   +---+---+---+
         ^
         |
         |
         |
         |
         |
   +-----|-----+
p: |     *     |
   +-----------+

下一步

p++;

现在我们有:

   +---+---+---+
   | % | d |\0 |
   +---+---+---+
             ^
             |
            /
           /
          /
         |
   +-----|-----+
p: |     *     |
   +-----------+

接下来您打电话给printf,但有点奇怪:

printf(p-2,23);

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

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

如果您更习惯地称为p-2,则该指针printfprintf("%d", 23)几乎是相同的指针。

现在,如果您认为printf收到了一个字符串,那么听到printf乐于收到char *的消息可能会让您感到惊讶-实际上它是始终会收到char *。如果这令人惊讶,请问自己,printf 收到了什么东西,如果不是指向char的指针?

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

  

对于C中的数组您不能做太多事情。每当您在C中的表达式中提及一个数组时,只要您似乎想对数组的值做一些事情,您得到的都是一个指向数组的第一个元素。

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

因此,由于C中的字符串是字符数组,因此在编写时

"%d"

是三个字符的数组。但是,当在表达式中使用它时,得到的是指向数组第一个元素的指针。例如,如果您写

printf("%d", 23);

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

如果我们说

char *p = "%d";
printf(p, 23);

我们做了同样的事情,只是更加明确了一点:再次,我们在表达式中提到了数组"%d",所以我们得到的值是指向其第一个元素的指针,因此那是用来初始化指针变量p的指针,那是作为第一个参数传递给printf的指针,所以printf很高兴。

在上面,我说过“在C语言中,'指向char的指针'是字符串类型,这在一定程度上是正确的”。后来我说“ C中的字符串是字符数组”。那是什么呢?数组还是指针?严格来说,字符串是指针数组。但是像所有数组一样,我们不能对它们做很多事情,而当我们尝试时,我们得到的是指向第一个元素的指针。因此,大多数时候,C语言中的字符串都是通过指向字符的指针进行访问,操纵和修改的。所有对字符串进行操作的函数(包括printf)实际上都接收到char指针,指向它们将要操作的字符串。

答案 3 :(得分:-1)

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

-> Char pointer将保存char datatype的地址,因为stringchar datatypes的集合。因此char pointer可以容纳string数据类型。

2。 p递增两次会发生什么?

->将char pointer分配给string时,指针将指向第一个字符。因此,当您将指针增加两次时,它将保存第三个字符的地址,在您的情况下为'\ 0';

3。当未使用明显的引号时,printf()如何打印字符串?

-> printf(p-2,23);在您使用"%d"的情况下,使用字符串作为格式标识符。