C 在指针中存储格式说明符

C 在指针中存储格式说明符,c,pointers,C,Pointers,当我这样做的时候会发生什么 { char * str = "%d\n"; str++; str++; printf(str-2,300); return 0; } 直观地说,屏幕上的数字似乎是300,但我想知道,str中存储了什么 编辑:如果有人能告诉我,我们什么时候能真正做到这一点,那就太好了? 谢谢 str是一个内存地址,最初是字符串文本%d\n的%符号的地址。创建此文本是因为它在代码中 两个增量使str指向字符\n,在这种情况下,str-2是%符号的地址。因此pri

当我这样做的时候会发生什么

{ 
  char * str = "%d\n";
  str++;
  str++;
  printf(str-2,300);
  return 0;
}
直观地说,屏幕上的数字似乎是300,但我想知道,str中存储了什么

编辑:如果有人能告诉我,我们什么时候能真正做到这一点,那就太好了?
谢谢

str
是一个内存地址,最初是字符串文本
%d\n
%
符号的地址。创建此文本是因为它在代码中

两个增量使str指向字符
\n
,在这种情况下,
str-2
%
符号的地址。因此printf会看到格式字符串
%d\n
,并像往常一样将格式字符串后面的第一个参数打印为整数。事实上,printf并不关心格式字符串的来源。无论您是可以动态创建它,还是硬编码它


我们一般不这么做。有时,您需要摆弄字符指针来扫描字符串、从字符串中提取某些内容,或者跳过字符串的某些前缀

您正在声明一个char指针。此指针将保存一个
RAM
地址,您将从该地址写入以下字节:
%
(1字节)
d
(1字节)
\n
(UNIX上为1字节,windows上为2字节)和
\0
结束字符串的空终止字节

然后将指针值(即第一个字节的地址)增加2,然后减少2。所以基本上你什么都不做。因此,当调用
printf()
src-2
时,将指向
%d\n
,空终止字节将使其完全通过
%d\n
。 因此,在一天结束时,你要做的是:


printf(“%d\n”,300)
str
是堆栈上的指针。它最初指向字符串literal
“%d\n”
(可能由编译器存储在程序的只读部分)的开头(即,保存的地址)

例如,假设字符串文本(
“$d\n”
)存储在0x5000。因此(假设UTF-8或ASCII)0x5000处的字节为
%
,0x5001处的字节为
d
,0x5002处的字节为
\n
(换行符),0x5003处的字节为
\0
(终止的空字符)

str
最初持有地址0x5000
str++
会将其增加到0x5001,这意味着它现在指向字符串
“d\n”
,即字符串文本
“%d\n”
。类似地,
str++
再次将其移动到0x5002,即字符串
“\n”
,在字符串文本
“%d\n”
中插入两个字符。请注意,所有这些仍然由0x5003处的空字符终止(C如何知道字符串何时结束)

printf
调用的第一个参数是格式字符串<此时code>str
保存0x5002,因此调用的意思是“使用从
0x5002-2=0x5000开始的格式字符串”,这与我们开始使用的字符串相同

因此,它将与调用相同

printf("%d\n",300)

并将打印出300。

是什么阻止您自己推断它?关于
x++
x-2
有什么需要额外解释的吗?这是我的一次测试中提到的。我无法推断出
str=%d
部分。为什么?你知道
++
做什么吗?你否决我的问题有什么问题?我有点怀疑。我问了。我不能吗?我第一次看到这样的东西`str=“%d\n”,所以我有疑问?如果你想回答这个问题,就这么做,如果你不想回答,至少不要降低论坛的质量。你是那种想看起来像“我什么都知道,你什么都不知道”的人。我没有否决你的问题。我不知道你知道什么和不知道什么,所以我正在努力弄清楚。显然,您对指针和指针算法还不熟悉,这很好,我只是想确定。
“%d\n”
是唯一的字符串文字(它是一个由4个字符组成的数组);指针指向该数组中的各种偏移。