零基础玩转C语言系列第五章——数组模块

简介: 数组模块

目录

一、一维数组

二、二维数组

三、数组越界

四、数组名是什么?

五、冒泡排序


【前言】

数组这块没有什么特别难理解的东西,所以容易上手,在这里,我就补充一些容易出现错误的小知识点,很容易理解哦。

一、一维数组

定义:数组是一组相同类型元素的集合。

type_t  arr_name[const_n];
//type_t:数组元素类型
//arr_name:数组名
//const_n:常量表达式,用来指定数组的大小

数组的创建错误示范:

int const = 10;
int arr[const];//注意哦,这样写是错误的


【敲黑板】:数组的创建,在C99标准之前,[ ]中要给一个常量才可以,不能使用变量。在C99之后支持了变长数组的概念,允许数组的大小是变量,但是对编译器有所要求,要求编译器支持C99标准。但是有很多编译器对C99的支持就不够好,所以我要说啥你肯定知道咯。

注意,对于字符数组要格外注意:

如:

char arr2[3] = {'a','b','c'};
//注意哦,末尾没有\0

sizeof(arr2) -->3

strlen(arr2) -->乱码!

【敲黑板】:注意比较strlen() 和sizeof

  • strlen() 是一个库函数,计算的是字符串的长度,并且只能作用于字符串,关注点在于字符串中是否有\0 ,计算的是字符串\0 之前的字符个数;


  • sizeof 是一个操作符,sizeof 是用来计算变量所占空间大小的,任何类型都可以使用,只关注空间大小,不在乎内存中是否有\0, 而且单位是字节

总结:

  • 数组是使用下标来访问的,下标是从0开始的;
  • 数组的大小可通过计算得到
int arr[10];
int sz = sizeof(arr) / sizeof(arr[0]);//40 / 4 == 10

 

【敲黑板】:

  • 一维数组在内存中是连续存放的;
  • 数组随着下标的增长,地址由低到高变化

二、二维数组

二维数组在数学里面叫矩阵。

注意哦,二维数组的初始化和一维数组不一样:

如:

int arr[ ][4]; //正确(行可以省略)

int arr[ ][ ]; //错误(列一定不能省略)

二维数组在内存中的存储:也是连续存放的哦!


二维数组可以理解为一维数组的数组,二维数组在内存中也是连续存放的,如果省略了列数,那么每行有几个元素也就不知道了,则第一行在哪里结束也就不知道了,所以不知道第二行应该放在第一行哪里。



三、数组越界


数组的下标是有范围限制的,规定数组的下标从0开始,如果数组有N个元素,那么最后一个元素的下标是N - 1,所以数组下标如果小于0 或者大于 N - 1,就属于越界访问了,超出了数组合法空间的访问。


C语言本身不作数组下标的越界检查,编译器也不一定报错,但是编译器不报错并不意味着程序是正确的。而且二维数组的行列也可能存在越界。

如:

int arr[10] = {1,2,3,4,5,6,7,8,9,10};
for(int i = 0; i <= 10; i++)
{
    arr[i] = 0; //当i == 10 时,就属于越界访问了!
}


四、数组名是什么?

一般情况下,数组名是首元素的地址,但是有两个特例:

  • sizeof(数组名):计算的是整个数组的大小,此时的数组名表示的是整个数组;
  • &数组名:取出的是整个数组的地址,此时的数组名表示的是整个数组。

除了上面两种情况,所有的数组名都表示数组首元素的地址!

五、冒泡排序

以升序为例,每一趟冒泡排序都是把一个最大的元素放

到最后面的过程。

void bubble_sort(int* arr, int sz)
{
  int i = 0;
  for (i = 0; i < sz - 1; i++)//冒泡排序的趟数跟元素个数有关
  {
    int j = 0;
    for (j = 0; j < sz - i - 1; j++)//比较的对数每一趟都不同,是在变化的
    {
      if (arr[j] > arr[j + 1])//以升序为例
      {
        int temp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = temp;
      }
    }
  }
}


相关文章
|
30天前
|
存储 编译器 C语言
【c语言】数组
本文介绍了数组的基本概念及一维和二维数组的创建、初始化、使用方法及其在内存中的存储形式。一维数组通过下标访问元素,支持初始化和动态输入输出。二维数组则通过行和列的下标访问元素,同样支持初始化和动态输入输出。此外,还简要介绍了C99标准中的变长数组,允许在运行时根据变量创建数组,但不能初始化。
37 6
|
1月前
|
存储 人工智能 BI
C语言:数组的分类
C语言中的数组分为一维数组、多维数组和字符串数组。一维数组是最基本的形式,用于存储一系列相同类型的元素;多维数组则可以看作是一维数组的数组,常用于矩阵运算等场景;字符串数组则是以字符为元素的一维数组,专门用于处理文本数据。
|
1月前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
1月前
|
存储 C语言
C语言:一维数组的不初始化、部分初始化、完全初始化的不同点
C语言中一维数组的初始化有三种情况:不初始化时,数组元素的值是随机的;部分初始化时,未指定的元素会被自动赋值为0;完全初始化时,所有元素都被赋予了初始值。
|
1月前
|
存储 数据管理 编译器
揭秘C语言:高效数据管理之数组
揭秘C语言:高效数据管理之数组
|
1月前
|
C语言 C++
保姆式教学C语言——数组
保姆式教学C语言——数组
17 0
保姆式教学C语言——数组
|
1月前
|
C语言
数组栈的实现(C语言描述)
本文介绍了如何在C语言中使用数组来实现栈的数据结构,包括栈的创建、入栈、出栈、获取栈顶元素、检查栈是否为空、获取栈的大小以及销毁栈等操作,并提供了相应的函数实现。
29 1
|
1月前
|
C语言
C语言数组
C语言数组
18 0
|
1月前
|
存储 C语言 索引
c语言回顾-数组(全网最详细,哈哈哈) (下)
c语言回顾-数组(全网最详细,哈哈哈) (下)
44 0
|
1月前
|
存储 编译器 C语言
c语言回顾-数组(全网最详细,哈哈哈)(上)
c语言回顾-数组(全网最详细,哈哈哈)(上)
56 0
下一篇
无影云桌面