C语言初阶——数组

简介: 一维数组一维数组的创建一维数组的初始化一维数组的使用一维数组在内存的存储二维数组二维数组的创建、初始化与使用二维数组在内存中的存储数组越界数组传参冒泡排序数组名总结

目录

前言

编辑正文

一维数组

一维数组的创建

一维数组的初始化

一维数组的使用

一维数组在内存的存储

二维数组

二维数组的创建、初始化与使用

二维数组在内存中的存储

数组越界

数组传参

冒泡排序

数组名

总结


前言


 数组是C语言中高频使用的工具,数组能将一组同类型的元素集合在一起,在进行调用或排序时很方便,由于有了数组,我们可以用数组名引用一系列变量,然后再通过下标索引的方式访问具体元素。数组还有一个特点:数组名表示首元素地址,这就意味着数组跟指针有着密切的联系,或者数组是指针的一种特殊表现形式。

b9f403fb62fb986143b0b0fbcc0bcc5.png


 注意:图片中代码的头文件位于文件最顶部,因截图无法截取,所以默认已引头文件

数组分为一维数组和多维数组,而在现阶段的学习中,只需要用到一维数组和二维数组,所以本文主要介绍这两种数组的特点和用法。


一维数组


一维数组是最简单数组,这种数组只带有一个下标引用操作符[ ] 指向关系比较明确,能够轻而易举的找到欲查找元素。


一维数组的创建


数组的创建需要有两个必要条件,一是数组内元素类型(整型、浮点型、字符型等),二是必须有数组名(数组名不能与关键字冲突),关于数组大小,可以不设定,但不能不清楚。

77121fb2ca087056f10c471d7b94c62.png

1b541b16f718e92ac20aa31d2305434.png



注意:创建数组时最好将三个条件设置好,同时不要用变量充当数组长度。

一维数组的初始化


同变量创建时顺便初始化一样,数组初始化能给数组赋上准确值,而不是不可知的随机值,同时在有的场景中数组初始化很重要。

b132e31e2d5265cbee44c9bc6e633a5.png

dfbcb6832fd91ea2f2963030b4dd2c9.png


注意:初始化时要注意是否已设定好数组大小,若设定好了大小,初始化时不能超过设定大小;若没有设定大小,初始化后数组内元素个数默认为数组大小。若是字符数组,且初始化时赋字符串,要特别注意字符串自带一个 \0 因此大小会加1。


一维数组的使用


数组在使用时需要依赖于下标引用操作符 [ ] ,也就是框住数组大小的那个符号,下标引用操作符就像是一道传送门,设置好目的地(下标),就能访问到相应的元素,从而进行使用。

7607b215c95f9ad74d13c1e8d23d5ff.png

//下标
int main()
{
  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
  printf("%d\n", arr[5]);//是否为数字5?
  int i = 0;
  for (i = 0; i < 10; i++)
  {
    //i是否可以等于10?
    printf("%d ", arr[i]);
  }
  return 0;
}

注意:1.数组是通过下标来使用的,下标从0开始。2.若数组的大小未知,可通过sizeof(arr)/sizeof(arr[0])计算得到,即数组名大小/数组首元素大小==40/4=10。


一维数组在内存的存储


我们都知道,内存地址是唯一且连续的,而我们的数组能通过下标访问元素,由此可以推断出数组在内存的储存也是连续的,具体元素地址也是唯一的。

35ca851eb49db4031a76c2ee30e9d74.png

注意:数组在内存中是连续存放的,且随着下标的增长,地址由低变高。


二维数组


二维数组由一维数组拉伸而来,也就是说二维数组一般比一维数组要长,因为是一维数组的同类,所以二维数组在很多地方跟一维数组有着相似之处。


二维数组的创建、初始化与使用


因为都差不多,所以我放在一起说

032743c6906bdd4c93b9c2c25967ba3.png

f191c8dde7b748b2775c3e07b6466b3.png

7eda7a937f7ab198bb03aca088a5c34.png


二维数组初始化跟一维数组一样,能省略,但只能省略一点点,即列不能省略


二维数组在使用时需要注意下标问题,因为是两个下标,所以在使用前可以先画图理解

二维数组在内存中的存储


我们已经知道了一维数组在内存中是连续存放的,那么二维数组是否也如此呢?

df0feb7a9969bc3f5b064fb3aa00f9e.png

//存储
int main()
{
  int arr[2][2] = { 1,2,3,4 };
  int i = 0;
  int j = 0;
  for (i = 0; i < 2; i++)
  {
    for (j = 0; j < 2; j++)
    {
      printf("行下标:%d 列下标:%d的元素地址为:%p\n", i, j, &arr[i][j]);
    }
  }
  return 0;
}


数组越界


数组的下标是有范围限制的,下标总是从0开始,到n-1结束(n表示数组大小),如果数组下标小于0或大于n-1,那么此时就属于数组越界。C语言本身不做越界检查,编译器也不一定会报错,但如果出现下标越界,就意味着程序有错误,需要我们程序员去排查错误或者在编写代码阶段做好下标的检查,避免出现越界

a72b0eb3990a02f6f69c664d68c1eb9.png

//越界
int main()
{
  int arr[10] = { 0 };
  int i = 0;
  for (i = 0; i <= 10; i++)
    printf("%d ", arr[i]);
  return 0;
}




数组传参


跟变量和常量一样,数组能作为参数传递给函数,以便函数执行操作

冒泡排序


冒泡排序可以将数组进行排序,因此需要把输入传入排序函数中。冒泡排序是拿元素逐个比较,确定所在的位置,完成排序。

ced9c12878b916524308faf03729ead.png

//冒泡排序-1.0-err
//这是一个错误版本
void bubble_sort(int arr[])
{
  int i = 0;
  int sz = sizeof(arr) / sizeof(arr[0]);
  for (i = 0; i < sz - 1; i++)
  {
    int j = 0;
    for (j = 0; j < sz - 1 - i; j++)
    {
      if (arr[j] > arr[j + 1])
      {
        int tmp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = tmp;
      }
    }
  }
}
int main()
{
  int arr[10] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
  bubble_sort(arr);
  int i = 0;
  for (i = 0; i < 10; i++)
  {
    printf("%d ", arr[i]);
  }
  return 0;
}

ec765676bcf7b5bc02597fb3b8738bb.png

//冒泡排序-2.0-right
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 - 1 - i; j++)
    {
      if (arr[j] > arr[j + 1])
      {
        int tmp = *(arr + j);
        *(arr + j) = *(arr + j + 1);
        *(arr + j + 1) = tmp;
      }
    }
  }
}
int main()
{
  int arr[10] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  bubble_sort(arr,sz);
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    printf("%d ", arr[i]);
  }
  return 0;
}

数组名



经过这么多程序的磨练,我们已经知道了数组名就是首元素地址的事实,但是有两个例外:

1.sizeof(数组名),此时数组名代表整个数组,sizeof(数组名)就是求出整个数组的大小


2.&数组名,此时取出的是数组的地址,数组名此时表示整个数组,在进行加减操作时会直接跳过整个数组。


总结


 数组的知识也比较简单,无非就是一维数组、二维数组的创建、初始化、使用、储存与数组传参,我们可以利用数组表示出矩阵,也就是说我们可以利用目前所学的知识写出三子棋、扫雷等小游戏,三子棋马上更新!


 如果本文有不足或错误的地方,随时欢迎指出,我会在第一时间改正!

e3dbb648dfe04861c36b41411c6fd9d.png



目录
相关文章
|
5天前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
28 4
|
1月前
|
存储 编译器 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语言——数组
18 0
保姆式教学C语言——数组
|
1月前
|
C语言
C语言数组
C语言数组
20 0
|
1月前
|
存储 C语言 索引
c语言回顾-数组(全网最详细,哈哈哈) (下)
c语言回顾-数组(全网最详细,哈哈哈) (下)
44 0
|
1月前
|
存储 编译器 C语言
c语言回顾-数组(全网最详细,哈哈哈)(上)
c语言回顾-数组(全网最详细,哈哈哈)(上)
56 0