黑马程序员技术交流社区

标题: C语言的输出格式??? [打印本页]

作者: 张秋月    时间: 2014-5-3 13:07
标题: C语言的输出格式???
本帖最后由 张秋月 于 2014-5-3 16:28 编辑
  1. #include <stdio.h>

  2. int main(int argc, const char * argv[])
  3. {

  4.     char name2[] = {'o', 'k'};
  5.    
  6.     printf("%c\n", name2[1]);
  7.    
  8.     printf("%s\n", &name2[1]);
  9.    
  10.     return 0;

  11. }
复制代码


为什么字符串在已字符串格式输出的时候,一定要加前边的&地址符呢?
而已字符形式输出的时候 就不需要加&地址符,为什么呢?
作者: 兰闻天    时间: 2014-5-3 13:23
#include <stdio.h>

int main(int argc, const char * argv[])
{

    char name2[] = {'o', 'k'};
   
    printf("%c\n", name2[1]); // 这个是输出的一个字符,就输出这个字符
   
    printf("%s\n", &name2[1]); //字符串是以某个地址开始输出直到遇到'\0'为止,所以字符串需要的是地址,一维数组中name2[1]表示的是字符,&name2[1]表示的才是地址
   
    return 0;

}
作者: 张秋月    时间: 2014-5-3 13:40
兰闻天 发表于 2014-5-3 13:23
#include

int main(int argc, const char * argv[])

哦哦,这个样子啊,多谢啦。
原来字符串输出的时候,是输出的地址哈。
作者: 兰闻天    时间: 2014-5-3 13:56
张秋月 发表于 2014-5-3 13:40
哦哦,这个样子啊,多谢啦。
原来字符串输出的时候,是输出的地址哈。

不是输出的地址,而是他首先查找地址,然后从这个地址的值开始,按顺序输出,直到遇到'\0';
比如ffc0存的是'0',ffc1存的是'k',ffc2存的是'0',ffc3存的是'k',ffc4存的是'\0';
你输出时查找的是ffc0的地址,它会把ffc0地址的值'0'输出出来,然后输出ffc1地址的值'k',然后是ffc2。。。,一直往下去查找,因为ffc4地址的值是'\0',这个时候输出才停止。
作者: 张秋月    时间: 2014-5-3 14:17
兰闻天 发表于 2014-5-3 13:56
不是输出的地址,而是他首先查找地址,然后从这个地址的值开始,按顺序输出,直到遇到'\0';
比如ffc0存的 ...

我要是输出&name2[0] 应该只输出“o”才对啊。

作者: 兰闻天    时间: 2014-5-3 14:47
张秋月 发表于 2014-5-3 14:17
我要是输出&name2[0] 应该只输出“o”才对啊。

字符串,应该是输出"ok"
作者: godlike    时间: 2014-5-3 15:41
本帖最后由 godlike 于 2014-5-3 15:43 编辑

首先,你定义字符串是以数组的形式定义的,这种方式少用,好处是可以修改其中的某个字符
其次,你要明白,数组名就是一地址值,并且是首元素的地址值,所以一下两种输出形式结果是一样的
  1. char name[] = "ok";
  2. printf("%s\n", name);
  3. printf("%s\n", &name[0]);
复制代码

用&这个符号就会从这个地址开始到 '\0' 为止输出之间的所有字符;也就是字符串,非要问为什么,那只能说这是c语言的规定,&后加 name,就会输出 i 之后的到 '\0' 的所有字符
printf("%c\n", name);//这个是输出其中的某个字符,是单个的;
其实一般我们定义字符串,如果这个字符串不需要修改时用:
char *name = "test";
当这个字符串不确定时用数组的形式定义,比如这个字符串是接受键盘输出的时候;






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2