关于字符数组和字符串

关于字符数组和字符串
【转】
引用:
火未燃说:
char a[5]={'C','h','i','n','a'};和char a[10]={'C','h','i','n','a'};
有效字符5个,'/0'表示结束,china共5个字符,但在内存占6个字节,a[10] 占足五个后遇到'/0'结束
结束符 系统会自带的,不用画蛇添脚^_^加上也无所


By EvilOctal
首先说 火未燃关于空字符系统自己加的说法是错误的 只有字符串才自己加 但是字符串和字符数组并非同一个问题!

我详细给你说说吧:
引用:
问题1:  我们定义一个字符串数组
char a[5]={'C','h','i','n','a'};和char a[10]={'C','h','i','n','a'};
问这两个数组在内存中分别占几位?
首先回答您的问题 a[5]肯定是占5个字节 a[10]肯定是占用10个字节
因为在C语言中 数组在声明的时候 系统会顺序给您分配N个sizeof(identifier)个空间 所谓顺序就是连续分配的 他们的内存地址是连续的
其实 火未燃说的 不对
字符数组和字符串是两个完全不同的概念 一定要搞清楚 不然程序要出错的!
首先: 字符数组是有单个字符存储构成的数组 字符以ascii形式存储在数组的成员变量中 但是系统不会给字符数组末尾自动加空字符 并且不能通过数组名作为指针常量调用
其次: 字符串是以空字符结尾的一系列字符 可以使用数组存储 系统自动加空字符 但是一定要留下一个空字符的位置 可以直接通过数组名调用
现在说说 火未燃的回答错在什么地方 他混淆了字符数组和字符串的概念 概念我们前面说了 很抽象 现在看看声明和初始化
声明并初始化字符数组
char a[5]={'C','h','i','n','a'};
//看到了么 没有空字符的位置 因为我的数组中放字符就5个元素 系统不会主动加/0的 火未燃说的不对 要想调用也得a[0]来使用C 这种特性和数值数组一样
声明并初始化字符串
char a[6]= "China";
//注意 是a[6]和双引号 因为这是一串字符 所以 最后要留空字符 否则如果你用a[5] 那么系统声明的空间里将没有给/0分配的那一个字节 你调用字符串的时候 系统将直到读到下一个空字符为止 有可能下一个空字符在系统内存的某个地方

最后副送一个知识点 当你用strlen求取字符串a[6]的长度的时候 将得到int 5的返回值 因为strlen函数不算空字符 系统自己加
引用:
问题2:  数组以'/0'为结束符,如果我们自己给数组的最后赋于一个'/0'字符,
问:系统还会默认再给该数组加上一 个'/0'结束符吗?
这个问题你无须关心 取决于你是否多分配了一个给他的空间 空字符无法显示 不可见 用于标志字符串的末尾 使用
char a[6] = "China";  //数组存储字符串
char *p = "China"; //指针存储 注意在在使用前为指针初始化(你现在无须掌握)
puts(a);
puts(p);
打印的都将是China换行
但是如果是这样
char a[5] = "China";
puts(a);
那么将产生无可预料的错误 因为你不知道下一个空字符在哪里 而用指针则没那个问题
系统读到第一个空字符就直接把前面的内容打印
你在数值数组 字符数组 和 字符串的这几个章节的知识没有扎实 重新好好回去读 这个问题不是问题
多看几遍书 就可以了


忽然想吃草的想法:
引用:
问题1:系统默认给字符串赋于一个'/0'字符,所以a[5]应该占6位
a[10]由于不足位补上'/0'所以应该占11位
但是看了书,给我的感觉应该是a[5]占6位  而a[10]占10位
数组分配多少位就是多少位 所有的字符都是一个字节 那么你分配的char a[N]; N是多少就是多少字节
但是int就不一定了 现在你也无需要知道 好好继续看书
引用:
问题2:个人认为应该会给予默认加上一个'/0'
只有字符串才会分配 千万不要象 火未燃兄弟那样以为字符数组和字符串是完全一个类型的存储方式 那样以后有很大的麻烦
学习知识要扎实 不然以后你要煮假生米的!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值