putchar和printf的区别,以及数组和指针的关系理解

来源:互联网 发布:单片机压力传感器调试 编辑:程序博客网 时间:2024/06/03 20:34
#include <stdio.h>

int main(void)
{
char string[] = "Good boy!";

printf(string);

printf("\n");

printf("%c\n",string[ 1 ]);

printf("%s\n",&string[ 0 ]);

printf("%s\n",&string[ 1 ]);

printf("%s\n",&string[ 2 ]);

putchar( string[ 1 ] );

printf( "\n" );

return 0;
}
上面是我自己写得代码,主要是为了学习数组,指针以及putchar和printf。
我从上面这段代码得出一些结论不知道对不对,另外还有一个问题:
string[ 1 ]是指针下标表示法,等同于*(string+1),都指的是对string指针的下一个指针的解引用。

即string[ 1 ]即代表了"o"字符,也代表了”ood boy!“字符串。

用printf打印的时候string[ 1 ]代表了”ood boy!“字符串,
用putchar打印的时候string[ 1 ]代表了”o“字符。

其实string也可以理解成数组。
string[ 1 ]也可以理解成数组的第二个元素。数组的第n个元素string[ n-1 ]其实就是指针string增加了n-1之后解引用。

所以数组a[ n ]的本质还是指针的运算之后解引用。

关于printf函数,做了一下尝试,以下代码:
1.printf("%c\n",'a');//运行结果 a
2.printf("%d\n",'a');//运行结果 97
3.printf("%d\n","a");//运行结果 4282172
4.printf("%c\n","a");//运行结果 <
5.printf("%s\n","a");//运行结果 a
6.printf("%d\n",97);//运行结果 97
7.printf("%c\n",97);//运行结果 a

前两个我打的理解是,‘a’代表了一个字符常量,用转换说明符可以转换成a或97,这个是ascii编码的内容。

345三个,用双引号引起来的代表了一个字符串,所以最后一个正确。3,4两个,字符串和%d或%c无法对应,所以会出现为止错误。

6,7两个,不用单引号或双引号,如果是数字则认为是数字常量,如果是字母则认为是变量。


以下是一位老师的回复:




string[ 1 ]既代表了"o"字符,也代表了”ood boy!“字符串。
你输出的时候用了
printf("%s\n",&string[ 1 ]);
这个想法不对,&string[ 1 ]就是个地址而已,真正决定操作的是函数。
举个例子,有个小偷询问你的家庭住址,你告诉他了,那么真正决定要去偷你家,还是偷你邻居家,还是偷你们整条街,是由小偷自己决定的。
小偷就是那个函数,你家的地址是string[ 1 ]所在的地址,你只是告诉了该函数该字符的地址,由函数决定如何运作。

用printf打印的时候string[ 1 ]代表了”ood boy!“字符串,
用putchar打印的时候string[ 1 ]代表了”o“字符。
综上,这个也是理解也是不对的,你要理解函数干了什么,而不是string[ 1 ]代表了什么。
printf打印%s的时候,会打印从该地址开始的下一个每一个字符,直到下一个字符是\0。
而putchar就是打印当前地址的字符


其实string也可以理解成数组
char string[] = "Good boy!";
这玩意你的定义本来就是个数组。

345三个,用双引号引起来的代表了一个字符串,所以最后一个正确。3,4两个,字符串和%d或%c无法对应,所以会出现未知错误。
3.printf("%d\n","a");//运行结果 42821724.printf("%c\n","a");//运行结果 <5.printf("%s\n","a");//运行结果 a
3是因为输出了字符串首地址,所以是一串数字。
4的原因类似于3,因为'a'这个字符常量实际上是ascii码,然后将"a"给予他的时候,他会解析为字符串首地址,如上所见实际上是一串数字,然后该函数会把这个数字当作ascii码输出。
5没啥好说的

最后:
每个人都有自己学习的方法,其实不用参考别人的学习方法,那么,我以我个人来看的话,很多东西即使你当时不懂,一开始也不要太深究(不是说完全不思考,是无法理解这种程度),当你使用他的时候你会明白他的。
当然我觉得这些也不太算小点和细节,是应当要理解的,不要太硬生生的去理解指针,随着使用会理解的。
主要是多写,用到实际当中。


详细请见链接
http://www.zhihu.com/question/32260584/answer/55384712?group_id=605330790805065728


string[ 1 ]既代表了"o"字符,也代表了”ood boy!“字符串。
你输出的时候用了
printf("%s\n",&string[ 1 ]);
这个想法不对,&string[ 1 ]就是个地址而已,真正决定操作的是函数。
举个例子,有个小偷询问你的家庭住址,你告诉他了,那么真正决定要去偷你家,还是偷你邻居家,还是偷你们整条街,是由小偷自己决定的。
小偷就是那个函数,你家的地址是string[ 1 ]所在的地址,你只是告诉了该函数该字符的地址,由函数决定如何运作。

用printf打印的时候string[ 1 ]代表了”ood boy!“字符串,
用putchar打印的时候string[ 1 ]代表了”o“字符。
综上,这个也是理解也是不对的,你要理解函数干了什么,而不是string[ 1 ]代表了什么。
printf打印%s的时候,会打印从该地址开始的下一个每一个字符,直到下一个字符是\0。
而putchar就是打印当前地址的字符


其实string也可以理解成数组
char string[] = "Good boy!";
这玩意你的定义本来就是个数组。

345三个,用双引号引起来的代表了一个字符串,所以最后一个正确。3,4两个,字符串和%d或%c无法对应,所以会出现未知错误。
3.printf("%d\n","a");//运行结果 42821724.printf("%c\n","a");//运行结果 <5.printf("%s\n","a");//运行结果 a
3是因为输出了字符串首地址,所以是一串数字。
4的原因类似于3,因为'a'这个字符常量实际上是ascii码,然后将"a"给予他的时候,他会解析为字符串首地址,如上所见实际上是一串数字,然后该函数会把这个数字当作ascii码输出。
5没啥好说的

最后:
每个人都有自己学习的方法,其实不用参考别人的学习方法,那么,我以我个人来看的话,很多东西即使你当时不懂,一开始也不要太深究(不是说完全不思考,是无法理解这种程度),当你使用他的时候你会明白他的。
当然我觉得这些也不太算小点和细节,是应当要理解的,不要太硬生生的去理解指针,随着使用会理解的。
主要是多写,用到实际当中。
0 0