Day05 数组

目录

一、数组概述数组

二、数组定义

三、数组元素的访问

四、数组大小

五、数组清空

1、bzero() 

2、memset() 

六、数组越界(溢出)

七、段错误的原因

八、字符型数组

九、数组型数组(多维数组)

十、柔性数组(变长数组)

十一、匿名数组

十二、零长数组


一、数组概述数组

  • 由一组相同数据类型的数据组成的集合。
  • 数组其实就是用户向内核申请的一块空间,只不过内核提供的这块空间的内存地址是连续的
  • 目的就是方便用户存储数据和访问数据。

二、数组定义

数组的定义格式:

数据类型  数组名[元素个数];

//元素个数可以是常量、常量表达式、运算符+操作对象
//数组所占内存大小=数据类型*元素个数

三、数组初始化

数据类型  数组名[元素个数]={元素1,元素2,元素3,.......元素n};

数组初始化的方式
        1、循环遍历初始化
        2、数组下标初始化
        3、定义时初始化

  • 元素个数可以省略,处理器会自动计算数组所需要的内存大小,但是一般需要在定义数组的同时进行初始化。
  • 数组在定义的时候进行初始化,声明之后不可以对数组进行初始化,要初始化数组中元素的值,只能通过数组下标的方式进行初始化
  • 如果对数组初始化时,未被赋初值的元素默认为0
  • 可以在初始化时,用下标对数组元素进行初始化赋值

三、数组元素的访问

  • 数组的下标是从0开始的,到元素个数-1结束
  • 数组名代表数组第一个元素的地址
数组元素与指针的关系:  
E1[E2]==*(E1+E2)-->*(E2+E1)-->E2[E1]

如果E1是数组名,E2是整型常量,则E1[E2]可以等价于 E2[E1]
这两种方式都可以访问数组中的元素。

注意:

  1. 数组名与sizeof()单独相遇时,不表示数组首元素地址,表示数组本身
  2. 数组名与&相遇时,不表示数组首元素地址,表示数组本身
  3. 地址不可以自增自减和赋值,因为地址是常量,要访问相应地址下的元素的值,可以使用指针

四、数组大小

//数组中元素的个数
数组中元素的个数==数组容量 / 数组中元素
//数组大小
sizeof(数组名);
sizeof(数组元素数据类型)*元素个数 

五、数组清空

1、bzero() 

//头文件      
    #include <string.h>
//函数原型    
    void bzero(void *s,size_t n)
//功能描述    
    清除参数s指向的地址的区域前n个字节
//返回值      
    无返回值

清空整个数组:
int buf[10]={0,1,2,3,4,5,6,7,8,9};
bzero(buf,sizeof(buf));

2、memset() 

//头文件       
    #include <string.h>
//函数原型     
    void *memset(void *s,int c,size_t n);
//功能描述     
    可以向参数s指向的地址对应的内存的前n个字节z中填充指定字节,待填充字节由用户指定
//返回值       
    函数返回参数s指向的内存地址

清空整个数组:
int buf[10]={0,1,2,3,4,5,6,7,8,9};
memset(buf,0,sizeof(buf));

六、数组越界(溢出)

数组越界(溢出)会产生内存错误(段错误)
注意:段错误在编译时不会报错,也不会发出警告,只有在程序运行阶段才会导致内存错误

七、段错误的原因

1、访问了没有权限访问的内存空间---野指针(NULL)
2、数据发生溢出,如数组越界
3、栈溢出--递归过深、局部变量占用过多空间
4、使用未初始化的指针或变量
5、在只读内存区域进行写操作
6、使用了已经释放的内存
7、多线程环境下访问共享内存时未正确同步
8、程序运行时发生内存损坏或者内存泄漏
9、硬件故障或操作系统错误导致内存访问异常

八、字符型数组

初始化字符数组:
char buf[5] = “abcde”;  
//不可靠   在末尾加上’\0’
//“abcde”是字符串常量,已经出现数组越界的情况,发生段错误

char  buf[5] ={‘a’,’b’,’c’,’d’,’e’,’\0’}; 
//对元素单独赋值是可靠的
//如果数组的容量刚好和字符串常量中的有效字符的数量一致时,就会导致数组越界,因为字符串常量的末尾有一个转义字符’\0’,也是需要占用1个字节的存储单元。

九、数组型数组(多维数组)

1、数组的定义规则: 
    数组名[元素数量]  + 元素类型

2、二维数组定义格式 :  
    元素类型 数组名称[元素数量][元素数量] 

3、数组元素的访问
    通过下标的方式或者地址的方式进行访问
(1)下标方式:E1[E2]
      int buf[3][4];
(2)地址方式:E1[E2]--->*(E1+E2)
      buf[1][1] ==>  * ( ( *(buf + 1) ) + 1 ) 

十、柔性数组(变长数组)

        用户定义一个数组,但是在定义数组的时候没有想清楚数组的元素数量,所以使用一个变量来代替数组元素个数
注意:当数组的内存一旦确定,则不会因为变量发生变化导致数组长度变化!

十一、匿名数组

匿名数组一般都是在函数参数中或者在多维数组中使用,很少单独使用。

二维数组  int buf[3][4];  --->  buf[3] 数组的每个元素的类型是 int [4]就是匿名数组。

十二、零长数组

        数组的长度可以是0,但是由于数组长度是0,所以操作系统是不会提供内存单元给数组的!但是用户可以访问。

相关推荐

  1. Day05 数组

    2024-06-18 12:46:01       32 阅读
  2. <span style='color:red;'>day</span><span style='color:red;'>05</span>

    day05

    2024-06-18 12:46:01      46 阅读
  3. 贪心算法day05

    2024-06-18 12:46:01       57 阅读
  4. <span style='color:red;'>Day</span>-<span style='color:red;'>02</span>-<span style='color:red;'>01</span>

    Day-02-01

    2024-06-18 12:46:01      60 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-18 12:46:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-18 12:46:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-18 12:46:01       87 阅读
  4. Python语言-面向对象

    2024-06-18 12:46:01       96 阅读

热门阅读

  1. C++中的八大设计原则

    2024-06-18 12:46:01       25 阅读
  2. window环境C++读取带中文的文档乱码问题

    2024-06-18 12:46:01       34 阅读
  3. 使用微信小程序制作画布

    2024-06-18 12:46:01       28 阅读
  4. 比较两个对象相同对象不同值

    2024-06-18 12:46:01       28 阅读
  5. “==“和 equals 方法究竟有什么区别?

    2024-06-18 12:46:01       35 阅读
  6. 【斗地主game】

    2024-06-18 12:46:01       28 阅读
  7. Ant-Design-Vue动态表头并填充数据

    2024-06-18 12:46:01       24 阅读
  8. 【React】如何理解 React 的 Fiber?

    2024-06-18 12:46:01       35 阅读
  9. Android XML 布局基础(八)帧布局 - GridLayout

    2024-06-18 12:46:01       33 阅读
  10. AndroidStudio|本地生成APK|build.gradle.kts配置

    2024-06-18 12:46:01       32 阅读
  11. NLP学习与踩坑记录(持续更新版)

    2024-06-18 12:46:01       34 阅读