一维数组和字符串
        首先是字符数组(区别字符串)
char buf[] = {'a','b','c'};   //这只是单纯的字符数组,不是字符串
        
  字符串最重要的标志就是结尾有一个'\0',所以如果表示字符串数组的话,要在结尾多一个'\0'
       
 
   但是,真的字符串数组有另一个更标准的表达形式
char buf[] = {"abc"}; // "" 双引号会自动在结尾添加一个'\0'
        简化为: char buf[10] = "abc" ;
        字符串数组和字符串指针的区别.
        首先声明
char buf[] = "abc";
const char *p = "abc";
        字符串数组是可以对其中的元素进行改变的,比如 buf[0] = 'k' 那buf就是 kbc;
        但是字符串指针不行, 指针变量p只是一个指针,它指向一个字符串常量,里面的内容是无法改变的 . *p = 'k' 只会报段错误.
 
 
    
字符空间 和 非字符空间
        定义:(详解)
            数据类型有 字符型 和 非字符型 :
  
            字符型有两个条件组成:
    1. 数据大小是char
    2. 数据的内容是可以通过ascii码转成字符的.
    叫做字符数据.
            比如 'A' 'B' 'c' 这些,就是字符类型的数据.但是,这样表达一眼就看出来是字符型数据了,没有什么意义啊.

  这要从内存空间开始说起..

    内存的最小空间是bit 是最小最小的格子.
    而数据的最小单位是char 1char = 8bit, 再往上还有int float long 等等...
                    
    那既然字符的首要条件是char类型的数据,我们就从char 这8个小格子说起.
    _ _ _ _ _ _ _ _ 8个bit=char

  字符空间:

                1个char 只能用来表示一个字符 比如字符 'A'
                那么 由char组成的数组,就是字符串的概念 char buf[10] ={'A', 'B', 'C', '0'}; //有4个char
                但是 拿字符'A'来举例, 字符'A' 的ascii码是65, 换成2进制是 0100 0001
                所以 'A'的char 8个空间的小格子就是 0100 0001 .
                那么,再正推一次.来看看什么是字符空间.
    
      1. 因为我定义了 char buf;   //表示buf是一个char大小8个小格子的数据,因为是char类型,所以能转换成ascii码,所以它就具备了字符空间的能力
      2. buf = (二进制)0100 0001     //因为buf这8个小格子的内容实际上是这样表示的,所以经过转码 它转换后的字符就是 'A'
                所以,我们在希望表达 它是一个字符空间的时候,定义成 char buf[10],并且字符空间的结尾一定是'\0'

  非字符空间:

                那什么事非字符空间呢? 非字符空间有很多种 char int float long...
                最特殊的就是 char.
 
                因为char 是软件的最小单位,在除了他能够表达一个字符数据以外,有时候我们纯粹是想记录一组数据.
 
                    比如:温度传感器检测到的温度,或者电机此刻的转速,等等这些 我们并不想转换成 字符的数据, 就称做非字符空间 .
 
                    我们当然可以用int来存储这样的数据,但是这是特别浪费内存的一件事,因为有些数据的大小可能就很小    .用char大小是完全能够表达的.
                    
                    假设我们现在定义一个数组来记录一天内采集到的温度 char tmp[24];
                    但是这样定义不就跟字符串数组一样了吗,我又该怎么区别 这是 字符空间 还是 非字符空间?
 
                    因为以上的困惑,我们规定
                    在表达字符空间 即 字符串数据的时候 定义成 char buf[10]
                    在表达非字符空间 即 只是单纯大小是char 大小的数据的时候 定义成 unsigned char buf[10]
        api:
            字符空间:
                //字符串拷贝,一旦拷贝时发现0,就停止拷贝
                char *strcpy(char *dest, const char *src);                  //不安全,内存泄漏
                char *strncpy(char *dest, const char *src, size_t n);       //安全,拷贝n个字符
 
                //将s2接在s1末尾.
                char *strcat(char *dest, const char *src);
                char *strncat(char *dest, const char *src, size_t n);
                
                //比较两个字符串,如果s1 == s2 ,则返回0, s1< s2 返回值小于0, s1>s2 返回值>0 .
                int strcmp(const char *s1, const char *s2);
                int strncmp(const char *s1, const char *s2, size_t n);
 
                //返回s的长度
                size_t strlen(const char *s);
 
            非字符空间:
                //因为非字符串空间没有'\0',所以只能通过拷贝的字符数来描述
                void *memcpy(void *dest, const void *src, size_t n);
 
                //比较
                int memcmp(const void *s1, const void *s2, size_t n);
 
                //赋值(清零)
                void *memset(void *s, int c, size_t n);
                ...

C语言数组篇(三)字符空间 和 非字符空间的更多相关文章

  1. C语言-数组篇

    C语言数组 一.数组的概念 用来存储一组数据的构造数据类型 特点:只能存放一种类型的数据,如全部是int型或者全部是char型,数组里的数据成为元素. 二.数组的定义 格式: 类型 数组名[元素个数] ...

  2. C语言数组篇(五)多级指针和二维数组指针的区别

    多级指针   以二级指针为例 二级指针的由来是 指针数组 的指针形式. int *p[10] 读取的顺序是 p[] --> 10个空间的数组 * p[] --> 这10个空间的数组里面存放 ...

  3. C语言数组篇(二)指针数组和数组指针

    数组指针 和 指针数组         这两个名词可以说是经常搞混了         数组指针--> 数组的指针       就是前面讲的 指向数组a的指针p;         指针数组--&g ...

  4. Java菜鸟学习笔记--数组篇(三):二维数组

    定义 //1.二维数组的定义 //2.二维数组的内存空间 //3.不规则数组 package me.array; public class Array2Demo{ public static void ...

  5. C语言数组篇(四)二维数组

      二维数组声明: ][] ={{,,},{,,}; //两行 三列         二维数组在声明的时候可以不写行,但一定要写列 ] = {{,},{,,},{}}; //未声明的地方自动补零 二维 ...

  6. C语言数组篇(一)一维数组

       0.  数组的两种表现形式         一种是常见的a[10];         //初学者常用         另一种是用指针表示的数组.   //实际工程使用.常用于参数传递       ...

  7. C语言函数篇(三)函数参数高级设计

    在内存空间中, 1. 单位大小的数据 叫 数值 . 比如 int a; char b; ... 2. 由这些单位数据组合起来的内存, 称作 空间. 比如: 各种数组char/int a[10]; 结构 ...

  8. Python全栈开发之路 【第三篇】:Python基础之字符编码和文件操作

    本节内容 一.三元运算 三元运算又称三目运算,是对简单的条件语句的简写,如: 简单条件语句: if 条件成立: val = 1 else: val = 2 改成三元运算: val = 1 if 条件成 ...

  9. Scala语言笔记 - 第三篇(容器方法篇)

    Scala语言笔记 - 第三篇(容器方法篇) 目录 Scala语言笔记 - 第三篇(容器方法篇) map和flapMap方法: ​ 最近研究了下scala语言,这个语言最强大的就是它强大的函数式编程( ...

随机推荐

  1. Dynamics CRM 4.0升级Dynamics CRM 2013后全局Ribbon的修改

    最近在为一个客户在Dynamics CRM 4.0到Dynamics CRM 2013的升级,升级之后发现原来在Dynamics CRM 4.0中定义的全局Ribbon按钮像牛皮癣一样,在每个实体页面 ...

  2. Unity Shader 阴影

    最近在看Unity shader开发实战详解,刚开始看阴影部分,稍微有了点思路.在这里写点笔记,算是小结吧. .阴影实现方法 一种是通过模拟光照的原理,用向量的方法 找到被光线照射的点 映射到平面的位 ...

  3. Mautic-2.2.0 (Ubuntu 16.04)

    平台: Ubuntu 类型: 虚拟机镜像 软件包: mautic-2.2.0 business intelligence commercial ecommerce mautic open-source ...

  4. day004-Map类

    1.Map集合概述 Map是一个接口,只要是实现了该接口的类就是一个双列集合. 双列集合就是每次存储元素时需要存储两个元素的集合. 这两个元素称为键值对, Key Value ==>映射关系 特 ...

  5. 从C++起步到MFC实战VC++软件工程师高端培训 视频保存在 播音员的网盘中

    从C++起步到MFC实战VC++软件工程师高端培训(服务器端开发方向)[共332课时]视频保存在 播音员的网盘中http://www.it1352.com/VideoTutorial/Details? ...

  6. MyEclipse 相关配置操作、问题处理及快捷键说明

    MyEclipse傻瓜式安装不做介绍,试用期结束后破解操作见博客:MyEclipse 2014 破解补丁及激活步骤 以下为安装完MyEclipse后一般需要进行的一些配置,写来自己参考用.比较简陋,望 ...

  7. NWERC 2013 - J (codeforces gym - 100405J)

    题目描述:给你一颗二叉树,保证每个点要么是叶子节点,要么有左右两个儿子.某些叶子节点上放着灯,请你移动最少的灯,使得整棵树平衡 对平衡的定义:对于树上的每个点左右儿子中灯数的差的绝对值≤1,那么这棵树 ...

  8. C盘压缩,电脑无法正常启动的解决方法?

    有时候,我们觉得电脑很卡,因此压缩磁盘来节约资源,前段时间,由于不小心将C盘压缩了,导致电脑无法正常启动,查了一些有关的资料,发现很多人都遇到过类似的问题,如果你不想重装系统的话,那么,现在我说一下我 ...

  9. 四大CPU体系结构ARM、X86/Atom、MIPS、PowerPC

    http://blog.csdn.net/wangjianno2/article/details/52140936 RISC(reduced instruction set computer,精简指令 ...

  10. Poj(2225),三维BFS

    题目链接:http://poj.org/problem?id=2225 这里要注意的是,输入的是坐标x,y,z,那么这个点就是在y行,x列,z层上. 我竟然WA在了结束搜索上了,写成了输出s.step ...