格式说明由“%”和格式字符组成,如%d%f等。它的作用是将输出的数据转换为指定的格式输出。
格式说明总是由“%”字符开始的。
释义 | 格式字符 | 表示 |
pointer | %p | 以16进制形式输出内存地址 |
decimalism 十进制 |
%d |
按十进制整型数据的实际长度输出 |
long decimalism | %ld | 长整型输出 |
octonary | %o | 八进制输出 |
hexadecimal | %x | 以十六进制输出整数,重要! |
unsigned decimalism | %u | 输出无符号整型, |
char | %c | 输出一个字符 |
string | %s | 输出一个字符串 |
float | %f | 输出实数,默认保留小数点后6位 |
%mf | 输出实数,保留小数点后m位 | |
exponent | %e | 指数形式输出 |
%g | 根据大小自动选f或e格式,且不输出无意义的零 |
注意:
1)一定要掌握 %x(或 %X 或 %#x 或 %#X),因为调试的时候经常要将内存中的二进制代码全部输出,然后用十六进制显示出来。下面写一个程序看看它们四个有什么区别:
# include
int main(void)
{
int i = 47;
printf("%x\n", i);
printf("%X\n", i);
printf("%#x\n", i);
printf("%#X\n", i);
return 0;
}
/*
在 VC++ 6.0 中的输出结果:
2f
2F
0x2f
0X2F
*/
从输出结果可以看出:如果是小写的x
,输出的字母就是小写的;如果是大写的X
,输出的字母就是大写的;如果加一个#
,就以标准的十六进制形式输出。
最好是加一个#
,否则如果输出的十六进制数正好没有字母的话会误认为是一个十进制数呢!
总之,不加#
容易造成误解。但是如果输出 0x2f 或 0x2F,那么人家一看就知道是十六进制。而且%#x
和%#X
中,笔者觉得大写的比较好,因为大写是绝对标准的十六进制写法。
释义 | 16进制 | 说明 |
小写 | %x | 输出的字母就是小写的 |
大写 | %X | 输出的字母就是大写的 |
#小写 | %#x | 以标准的十六进制形式输出 |
#大写 | %#X |
2)使用%u输出无符号整型(unsigned),输出无符号整型时也可以用 %d,这时是将无符号转换成有符号数,然后输出。但编程的时候最好不要这么写,因为这样要进行一次转换,使 CPU 多做一次无用功。
转义字符 |
意义 |
ASCII码值(十进制) |
\a |
响铃(BEL) |
007 |
\b |
退格(BS) ,将当前位置移到前一列 |
008 |
\f |
换页(FF),将当前位置移到下页开头 |
012 |
\n |
换行(LF) ,将当前位置移到下一行开头 |
010 |
\r |
回车(CR) ,将当前位置移到本行开头 |
013 |
\t |
水平制表(HT) (跳到下一个TAB位置) |
009 |
\v |
垂直制表(VT) |
011 |
\\ |
代表一个反斜线字符''\' |
092 |
\' |
代表一个单引号(撇号)字符 |
039 |
\" |
代表一个双引号字符 |
034 |
\? | 代表一个问号 | 063 |
\0 |
空字符(NUL) |
000 |
\ooo |
1到3位八进制数所代表的任意字符 |
三位八进制 |
\xhh |
十六进制所代表的任意字符 |
十六进制 |
首先,一个变量的地址存放的是该变量第一个字节的编号,比如 整型变量 i 占 4 个字节,但是 i 的地址存放的是整型变量 i 的第一个字节的编号(也就是地址)。那么通过第一个字节的编号怎么找到变量 i 呢,即整型变量占 4 个字节,从第一个字节的位置往下数 8 个字节就是整型变量 i 所在的位置了。
其次,为什么地址变量都占 4 个字节呢?因为内存有 4 G 个编号,为了方便存放编号太大的字节,所以,地址变量的空间就用 4 个字节来表示了。