zoukankan      html  css  js  c++  java
  • C语言数组篇(三)字符空间 和 非字符空间

     一维数组和字符串
            首先是字符数组(区别字符串)
    char buf[10] = {'a','b','c'};   //这只是单纯的字符数组,不是字符串
            
      字符串最重要的标志就是结尾有一个'',所以如果表示字符串数组的话,要在结尾多一个''
           
     
       但是,真的字符串数组有另一个更标准的表达形式
    char buf[10] = {"abc"}; // "" 双引号会自动在结尾添加一个''
            简化为: char buf[10] = "abc" ;
            字符串数组和字符串指针的区别.
            首先声明
    char buf[10] = "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],并且字符空间的结尾一定是''

      非字符空间:

                    那什么事非字符空间呢? 非字符空间有很多种 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);
     
                非字符空间:
                    //因为非字符串空间没有'',所以只能通过拷贝的字符数来描述
                    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);
                    ...
  • 相关阅读:
    洛谷 P1144 最短路计数
    浅谈最短路计数问题
    洛谷 P1608 路径统计
    洛谷 P6863 [RC-03] 上下求索
    浅谈差值DP
    洛谷 P1651 塔
    JDOJ 1222: VIJOS-P1037 搭建双塔
    浅谈常见字符串处理函数
    浅谈各种浮点数运算函数
    洛谷 P6859 蝴蝶与花
  • 原文地址:https://www.cnblogs.com/kmist/p/10073651.html
Copyright © 2011-2022 走看看