C语言第九章:数组

Posted 歌咏^0^

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言第九章:数组相关的知识,希望对你有一定的参考价值。

一、数组的概念

         由相同类型的多个元素所组成的一种复合数据类型


二、什么时候会用到数组

        在工程中同时定义多个相同类型的变量时,定义多次会非常麻烦,可以考虑使用数组

三、格式:

         类型说明符  数组名[整型常量表达式];

        "类型说明符":        指定数组元素的类型,任意C语言合法的类型都可以。
        "数组名":               C语言标识符,其值为该数组的首地址(常量)
        "整型常量表达式":指定数组元素的个数。
    eg:
        int a[10];
            
        元素的数据类型  数组的名字[元素的个数];

        比如:int  array[5];//定义一个数组array,该数组一共有五个元素,每个元素都是int类型    

        注意: 元素的个数  不要使用  变量,不同处理器处理结果不同,很多编译器 都会给你报错

        #include<stdio.h>

        int main(void)
        {
            //分开定义
            int a,b,c,d,e;
            //使用数组定义
            int array[5];
    
            return 0;
        }


四、特点

    1)数组中所有的元素(变量)类型都是一致的    
    2)数组申请的内存是连续的。从低地址到高地址依次连续存放数组中的每个元素。

五、一维数组元素的引用

        数组名[下标]
        "下标":C语言下标是从0开始,下标必须为>=0的整数
            a[0]、a[1]、a[2]....a[9]
                引用数组元素a[i]跟普通变量一样,即可以作为左值,也可以作为右值
               下标的最小值为0最大值为 元素个数-1

        “下标越界”:理论上可用,但当他覆盖重要数据的内存时,使程序崩溃

六、一维数组的赋值

        1、定义的时候初始化
        比如:    int array[5] = {1,2,3,4,5};
                       --->语法正确,如果对全部数组元素赋初值,那可以不指定数组长度
       

                (1)、赋值的时候,成员之间使用逗号隔开;赋值的成员的数据类型要与数组定义的数据类型一致
                (2)、初始化列表的时候,个数小于或者等于长度
                            int array[5] = {1,2,3};---->语法正确
                               array[0] = 1;
                         array[1] = 2;
                         array[2] = 3;
                         array[3] = 0;
                         array[4] = 0;
            

                如果是定义的时候初始化,但是初始化列表个数小于数组的大小,那么无论这个数组是全局变量还是局部变量没有赋值的成员都是为0
                int  array[3] = {100,200,300,400};//错误越界访问没有申请到的空间

        2、先定义,没有初始化          ---》全局变量0局部变量随机值
                int  array[3];//局部变量 所有元素是随机值,全局变量所有元素的值为0

        3、清空数组
                int array[5] = {0}; //表示给array数组中第0个元素赋值为0,后面所有元素都会默认为0

                一维数组的名字 代表 首元素的地址

             
七、二维数组

        1、概念
            其实就是一维数组的集合            
            int buf[5][3]:
    
            第一种解释:
                    定义一个二维数组,该数组由五个一维数组组成,分别是:
                    buf[0]    buf[1]    buf[2]    buf[3]     buf[4]    
                    每个一维数组由3个元素组成,所以该二维数组一共由15个元素
        
           第二种解释:
                   该数组一共由五行,每行由三个元素组成(也就是五行三列)            

    char  buf[5][6]

        2、二维数组在内存中的存放:
                按行存放,即先顺序存放第一行的元素,再存放第二行的元素...
        
        3、二维数组元素的引用
                数组名[第几行][第几列]
        
        4、二维数组的初始化
               (1)分行给二维数组赋初值
                    int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

               (2)将所有数据写在一个花括号内,按数组的排列顺序对各元素赋初值
                    int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

               (3)对部分元素赋初值,其余的元素自动置0
                    int a[3][4]={1,2,3};
                    int a[3][4]={0};
               (4)如果对全部元素赋初值,则定义数组时可以对第一维的长度省略,
                    但第二维的长度不能省略
。 
                    int a[][4]={1,2,3,4,5,6,7,8,9,10};

        5、注意二维数组的名字其实也是地址,代表最大个元素类型的首地址


八、字符数组

        字符数组,数组元素是char(字符型)的数组,它可以是一维数组,也可以是二维数组。

        字符串常量:储存在虚拟内存的数据段


        1、定义的时候赋值
                    char c1[]={'c','h','i','n','a'};
                    char c2[]={"china"};
                    两者有什么区别?
                        char c2[]={"china"};
                        <==>char c2[]={'c','h','i','n','a','\\0'};
                字符串保存在内存中时会在末尾加一个终止符'\\0','\\0'的ASCII码就是0。
                终止符的作用是用来标志字符串的结束。
                我们在进行操作字符串时都是代入字符串的首地址,正因为每个字符串都有一个终止  符,系统才知道字符串的具体范围。
                字符数组名是一个常量,其值为保存的字符串的首地址

        2、如果字符数组在定义的时候没有赋值,只能通过元素单个赋值或者字符串操作函数进行赋值
            string[0] = 'h';
            string[1] = 'e';
            strcpy(string,"hello");
    
            特别注意:这种写法是错误的:
            char string[6];    
            string[6] = "hello";//错误
            string = "hello";//也是错误的

            原因:数组元素的访问只能是通过单个元素进行的,所以string[6]是错误的;数组的名字经过编译之后其实就是一个地址,也就是常量(比如可能是0x00ff110f),所以给一个地址赋值是错误的,string = "hello";//也是错误的

            char  string[3][10] = {{ },{ },{ },{ }};
            char string [3][10] = {"hello","world","www"};
            char *string[3] = {"hello","world","www"};


九、字符串操作函数

        1、字符串的拷贝  string copy -----strcpy

                头文件
                    #include <string.h> 
                定义函数 
                    char *strcpy(char *dest, const char *src);
                函数的作用:
                    字符串的拷贝,将src字符串 拷贝到dest
                参数:
                    dest:目标字符串
                    src : 源字符串 

        2、字符串的比较  string  compare----->strcmp

        3、测量字符串的长度   string  length  -----strlen
            char str1[100] = "hello";
    
            int length = strlen(str1);
    
            printf("length:%d\\n",length); //length:

        注意:strlen--->测试的字符串长度 不包括  '\\0'

以上是关于C语言第九章:数组的主要内容,如果未能解决你的问题,请参考以下文章

第九章 指针

《汇编语言 基于x86处理器》第九章字符串与数组部分的代码

C++Primer 第九章

C++ Primer 第九章顺序容器

第九章----java数据类型和字符串处理

R语言实战 第九章 方差分析