Closed. This question needs to be more
focused。它当前不接受答案。
想改善这个问题吗?更新问题,使其仅通过
editing this post专注于一个问题。
2年前关闭。
请看一下这段代码。
#include <stdio.h>
int main()
{
char *p;
p = "%d";
p++;
p++;
printf(p-2,23);
return 0;
}
我有以下问题
1)指向字符数据类型的指针如何保存字符串数据类型?
2)当p递增两次时会发生什么?
3)如果不使用明显的引号,
printf()
如何打印字符串?
“指向字符数据类型的指针如何容纳字符串数据类型?”好吧,在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
,则该指针
printf
几乎与
printf("%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的指针,指向它们将操作的字符串。