[转]char * 和字符数组

原文地址: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

[转]char * 和字符数组相关推荐

  1. C语言中字符数组char[] 和 字符串char*的区别

    在程序结构设计中使用结构体定义新的数据类型,如 typedef struct { int type; int value; char arg[]; } CommandInfo; 在strcpy时将一个 ...

  2. C语言从青铜到王者——数组详解总结【一维数组、二维数组、字符数组、数组实例】

    所谓数组,是指将那些具有相同类型的.数量有限的若干个变量通过有序的方法组织起来的一种便于使用的形式.数组属于一种构造类型,其中的变量被称为数组的元素.数组元素的类型可以是基本数据类型,也可以是特殊类型 ...

  3. c++ string 拼接_C++日志(二十五)字符数组、字符数组指针和string类

    C++中字符串的表示方式有很多种,根据自己目前掌握的有三种: 字符数组: 字符数组指针: 标准库string类: 上面几种方式各有优点和缺点,按照自己的观点,如果处理的字符串的任务比较简单,则使用前两 ...

  4. C语言之字符数组在if{}里面赋值给char *引发的问题

    1 问题 我的buff在if{}里面,然后对buff进行内存操作,最后赋值给char *类型的url,发现url最后没有得到数据 如下代码 #include <stdio.h> #defi ...

  5. [小技巧][JAVA][转换]字符数组char[]与字符串String之间互相转换

    1.字符数组转为字符串 方法1:直接在构造String时转换. char[] data = {'a', 'b', 'c'}; String str = new String(data); 方法2:调用 ...

  6. MFC中CString类字符串与长整型、浮点型、字符数组char数据之间的相互转换

    一.长整型数据与CString类字符串相互转换 1.将长整型数据转换为CString字符串类 CString str; long ld; str.Format(_T("%ld"), ...

  7. C语言,判断二维字符数组是否存在回文字符串 例如:char a[] [10]={“asd“,“asa“,“werew“,“yuyu“};

    判断二维字符数组是否存在回文字符串 例如:char a[] [10]={"asd","asa","werew","yuyu&quo ...

  8. C语言 请编写函数CHG(char *S) 把字符数组左移后逆转

    6-2 请编写函数CHG(char *S) (10 分) 请编写函数CHG(char S)实现程序功能: 把S字符串中的所有字符左移一个位置,串中的第一个字符移到最后,之后把已处理的字符串逆转后仍存入 ...

  9. char[]字符数组使用toString变为乱码的原因(其实不是乱码,是“类名+@+地址”)

    java 字符数组使用toString变为乱码(其实是地址). 因为String字符串可以通过toCharArray()得到字符数组,所以很多初学者就会想到对字符数组使用toString()的方法得到 ...

最新文章

  1. c库的rand/random随机数产生函数性能差?
  2. 阿里P8大牛耗费三年整理的:Java大厂面试题
  3. PHP isset 函数作用
  4. 中文论文万能句型_SCI 论文写作万能句型(每天一点小进步哦)
  5. 1.Hyper-V虚拟机在wifi环境下的外网连接配置
  6. java treemap用法_JAVA作业,使用TreeMapK,V类
  7. 标准C程序设计七---77
  8. Java BufferedWriter close()方法与示例
  9. CentOS 7.1 Bridge启用STP报错Master connection not found or invalid
  10. 基于知识图谱的推荐系统总结
  11. linux sftp创建多用户,同一台 Centos (Linux)服务器设置多个sftp 账号,并限制用户只能访问指定文件路径...
  12. 服务器账号永不过期,linux下如何设置用户密码永不过期_网站服务器运行维护
  13. win7休眠的开启与关闭方法
  14. 排版——用Markdown写Csdn博客
  15. Android 推流--分辨率、帧率和码率三者之间的关系
  16. 蓝牙技术|蓝牙标准将迈向 6GHz 频段,蓝牙技术迈向新台阶
  17. Moba类游戏中如何处理网络延迟与卡顿
  18. 如何安装cygwin工具
  19. VGGNet结构分析
  20. adobe cep html engine 停止工作,ps2019adobe cep html engine应用程序错误怎么办?

热门文章

  1. 几位无人驾驶领域的杰出科学家
  2. 百度顶会论文复现(4):飞桨API详解
  3. 3.Your First Machine Learning Model
  4. java 主备切换_keepalived 实现 Java 服务的高可用(主备切换)
  5. 升级oracle spu,关于Oracle数据库PSU/SPU/BundlePatch的补丁号变化
  6. c语言编程三问三答,c语言程序编程
  7. android onscrolllistener判断到底部,判断RecyclerView是否滑动到底部
  8. 原 剑指offer(刷题11-20)--c++,Python版本
  9. 处理机器学习大数据的7种方法
  10. 内存泄漏快速定位方法