博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转]char * 和字符数组
阅读量:4640 次
发布时间:2019-06-09

本文共 1251 字,大约阅读时间需要 4 分钟。

[转]

原文地址:http://www.cnblogs.com/jeakon/archive/2012/05/27/2816809.html

 

代码中的int * i就是我们关注的焦点。它是一个指向int指针。也就是说:i指向一个内存地址,从这个地址开始存储了一个数据。int * i中的int标明应该使用int类型(长度为sizeof(int)个字节)来从这个地址取数据,也就是说要一次取sizeof(int)个byte的数据来拼成最后的结果。最后一个例子也证明了这一点:如果我们强制用unsigned char的大小的数据类型来对这个地址操作,就只能取出数据的一部分。反过来说,如果用较大数据类型来取实际存储较小数据类型的数据,就有可能越界操作内存,取回一些杂乱的内容或导致系统崩溃。int b[]这个数组,标明有一组数,放在以&b开始地址的内存空间内,每个元素占用了sizeof(int)个byte的内存单元;如果有类似于i=&b;i++;的操作,i的值就每次递增sizeof(int)而不是1,这样确保了i每次都能恰好取回一个正确的int。

同理,char * c也是如此。如果我们定义了一个char *的变量c,那么c也只不过是一个指向内存中某个地址的指针而已。之所以标明它是char *的类型,就是说要以sizeof(char)为单位去内存中取数。所以,我们应该称呼char * c为指向char类型的指针——而不是说c就是字符串。为什么传一个char *指针给printf(),strlen()之类的函数,它就能把它当作一个字符串来处理呢?没错,我们不是定义了'\0'来表示一个"字符串"的终结么?我们只需从起始地址不断累加,遍历字符数组的每一个元素,直到找到一个'\0'为止,就算是处理一个字符串了——从起始地址到'\0'为止的字符数组元素构成一个“字符串”,这就是C语言设计字符串的原理。

所以,当一个函数要求传入一个char *的参数,并不一定这个参数就一定是字符串(以'\0'结尾的字符数组),char *只是一个字符指针而已,它仅仅提供了一个内存地址和每次遍历元素的偏移量而已。究竟函数对传入的参数有什么要求,还要视函数的具体实现而定。(我想ANSI C应该对参数有所要求和规定,可惜偶没有ANSI C文件,无法参考。 )C语言一般约定是用char * str来表示以'\0'结尾的字符数组,但是由于某些实现上的效率的考虑,往往没有严格遵守这个约定。C语言的设计理念中没有强调使用者一定要使用遵守这个约定,不遵守这个约定也不违背C语言的基本语法规则。这或许可以看作是C语言和创造和使用它的黑客群体崇尚自由的一种特色、一种精神文化吧。

 

trackback:http://blog.vckbase.com/smileonce/archive/2005/06/26/8330.html

 

转载于:https://www.cnblogs.com/schowen/p/5513458.html

你可能感兴趣的文章
POJ 2031 Building a Space Station
查看>>
面向对象1
查看>>
编程开发之--java多线程学习总结(5)
查看>>
register_globals(全局变量注册开关)
查看>>
as3调用外部swf里的类的方法
查看>>
如何让 zend studio 10 识别 Phalcon语法并且进行语法提示
查看>>
任意阶幻方(魔方矩阵)C语言实现
查看>>
视频教程--ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库
查看>>
第五次作业
查看>>
织梦教程
查看>>
杭电多校 Harvest of Apples 莫队
查看>>
java 第11次作业:你能看懂就说明你理解了——this关键字
查看>>
C/C++心得-结构体
查看>>
函数名作为参数传递
查看>>
apt-get for ubuntu 工具简介
查看>>
数值计算算法-多项式插值算法的实现与分析
查看>>
day8-异常处理与网络编程
查看>>
Python基础-time and datetime
查看>>
Linux epoll 笔记(高并发事件处理机制)
查看>>
shell脚本练习01
查看>>