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



目录
相关文章
|
1月前
|
C语言
在C语言中数组作为函数参数的应用与示例
在C语言中数组作为函数参数的应用与示例
15 0
|
1月前
|
C语言
【进阶C语言】数组笔试题解析
【进阶C语言】数组笔试题解析
17 0
|
20天前
|
编译器 程序员 C语言
【C语言】变长数组,二分查找和数组之间自动替换的实现
【C语言】变长数组,二分查找和数组之间自动替换的实现
|
20天前
|
存储 C语言
【C语言数组】创建、初始化、以及使用2
【C语言数组】创建、初始化、以及使用
|
1月前
|
存储 程序员 C语言
C语言中的结构体数组
C语言中的结构体数组
9 0
|
1月前
|
存储 C语言 索引
C语言一维数组
C语言一维数组
13 1
|
1月前
|
存储 编译器 C语言
【c语言 】数组入门
【c语言 】数组入门
30 0
|
1月前
|
存储 搜索推荐 C语言
|
1月前
|
存储 Serverless C语言
C语言——字符数组
C语言——字符数组
15 0
|
1月前
|
存储 C语言 索引
C语言—数组介绍
C语言—数组介绍
11 1