指针主要用于存储其他变量的地址,如下面的代码,
char a='A',*p;
p=&a;
printf("p: %p *p: %c p: %c\n",p,*p,p);
output: p: 0x7ffc81b8d9ef *p: A p: �
1。从上面的输出中,如果我们想打印'p'值,则它正在获取垃圾值。
按字符串
char *p ="A";
printf("p: %p *p: %c p: %s\n",p,*p,p);
output:p: 0x55ce091de714 *p: A p: A
2。从上面的输出中,如果我们要打印'p'值,则将其打印为A。
从1&2'p'仅用于存储地址,但是在第二种情况下为什么要打印总字符串,而为什么在第一种情况下无法打印值。
我们如何确保这一点?
1。从上面的输出中,如果我们想打印'p'值,则它正在获取垃圾值。
%c
转换说明符希望其参数具有类型char
。 p
的类型为char *
,并存储a
的地址。由于这种类型的不匹配,其行为为undefined,并且输出在字面上可以是任何东西。一种可能是printf
试图将p
的第一个字节解释为char
,但是该值可能超出了基本字符集中可打印字符的范围,因此无论扩展字符是什么,都可以得到一个字形set由系统使用。
2。从上面的输出中,如果我们要打印'p'值,则将其打印为A。
%s
转换说明符希望其参数具有类型char *
,并指向string中的第一个字符。然后,它将打印该字符串的每个连续字符,直到看到字符串终止符为止。如果您的字符串是"ABC"
,则输出将是p: <some address> *p: A p: ABC
。