A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张秋月 初级黑马   /  2014-5-3 13:07  /  1312 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张秋月 于 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. }
复制代码


为什么字符串在已字符串格式输出的时候,一定要加前边的&地址符呢?
而已字符形式输出的时候 就不需要加&地址符,为什么呢?

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

6 个回复

倒序浏览
#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;

}

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
兰闻天 发表于 2014-5-3 13:23
#include

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

哦哦,这个样子啊,多谢啦。
原来字符串输出的时候,是输出的地址哈。
回复 使用道具 举报
张秋月 发表于 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 13:56
不是输出的地址,而是他首先查找地址,然后从这个地址的值开始,按顺序输出,直到遇到'\0';
比如ffc0存的 ...

我要是输出&name2[0] 应该只输出“o”才对啊。
回复 使用道具 举报
张秋月 发表于 2014-5-3 14:17
我要是输出&name2[0] 应该只输出“o”才对啊。

字符串,应该是输出"ok"
回复 使用道具 举报
本帖最后由 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";
当这个字符串不确定时用数组的形式定义,比如这个字符串是接受键盘输出的时候;

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马