想要了解数组吗?进来看看(上)

简介: 想要了解数组吗?进来看看(上)

本片博客会从以下几个方面带大家了解一下数组

1.一维数组的创建和初始化;2.一维数组的使用;3.一维数组在内存中的存储

4.二维数组的创建和初始化;5.二维数组的使用;6.二维数组在内存中的存储

7.数组越界;8.数组作为函数参数;


接下来本博主带大家一一领略


一、一维数组的创建和初始化


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

数组的创建方式:

type_t   arr_name   [const_n];

// type_t 是指数组的元素类型

//arr_name指数组名

// const_n 是一个常量表达式,用来指定数组的大小

这里我们注意:

C99 标准之前 数组的大小只能是常量表达式

C99 标准中引入了:变长数组的概念,使得数组在创建的时候可以使用变量,但是这样的数组不能初始化

下面就是一个简单数组创建:


1. int arr1[10];
2. char arr1[];


数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)。

下面是数组的简单初始化:


1. int arr1[10] = {1,2,3,4,5,6,7,8,9,10};//完全初始化
2. int arr2[10] = { 1,2,3 };//不完全初始化,剩余的元素默认都是0
3. int arr3[10] = { 0 };//不完全初始化,剩余的元素默认都是0
4. int arr4[] = { 0 };//省略数组的大小,数组必须初始化,数组的大小是根据初始化的内容来确定
5. int arr5[] = { 1,2,3 };
6. char arr1[] = "abc";//一个元素
7. char arr2[] = {'a', 'b', 'c'};//三个元素
8. char arr3[] = { 'a', 98, 'c' };


初始化时一定是需要给一些合理的初始值


int arr6[];//错误初始化


二、一维数组的使用


数组必须先定义,然后使用。C 语言规定,只能逐个引用数组元素,而不能一次引用整个数组。前面讲过,数组元素的表示形式为:

数组名[下标];

下标可以是整型常量或整型表达式,比如:

a[0] = a[5] + a[7] - a[2 * 3];

千万要注意,定义数组时用到的“数组名[常量表达式]”和引用数组元素时用到的“数组名[下标]”是有区别的,定义数组时的常量表达式表示的是数组的长度,而引用数组元素时的下标表示的是元素的编号。比如:

1. arr[5]={1,2,3,4,5}
2. //表示有五个元素,分别存储1,2,3,4,5
3. //下标从0开始,到你所定义的数组长度-1结束,此处是5;
4. //a[0]=1,a[1]=2,a[2]=3,a[3]=4,a[4]=5;

关于数组在scanf()与printf()中的使用,一般借助for语句

1. int i = 0;
2. int arr[5] = {1,2,3,4,5};
3. for(i = 0;i<5;i++)
4. {
5.     scanf("%d",&arr[i]);
6. }
7. for(i = 0;i<5;i++)
8. {
9.     printf("%d",arr[i]);
10. }


这里注意:由于在使用时表示的时元素的编号,所在输入时要加上&


三、一维数组在内存中的存储


数组在内存中的存储是连续的,我们写一个代码给大家看一下就明白了


1. int main()
2. {
3.  int arr[10] = { 1,2,3,4,5 };
4.  int sz = sizeof(arr) / sizeof(arr[0]);
5.  int i = 0;
6.  for (i = 0; i < sz; i++)
7.  {
8.    printf("&arr[%d] = %p\n", i, &arr[i]);
9.  }
10. 
11.   return 0;
12. }

这时候我们运行一下

打印坐标后我们发现每个坐标中间相差4,那是因为我们这里用的是int,所以占4个字节

仔细观察输出的结果,可知随着数组下标的增长,元素的地址,也在有规律的递增。 由此可以得

出结论:数组在内存中是连续存放的

 

总结:

  1. 数组在内存中开辟是线性连续且递增的。
  2. 在c语言中,任何变量(基本变量,指针变量,结构体变量,数组变量)的空间都是整体开辟,但任何元素的起始地址一定是开辟字节当中最小的。


四、二维数组的创建和初始化


二维数组的创建

1. //数组创建
2. int arr[3][4];//[行数][列数]
3. char arr[][5];
4. double arr[2][4];

二位数组的初始化

1. //数组初始化
2. int arr[3][4] = {1,2,3,4};
3. int arr[3][4] = {{1,2},{4,5}};
4. int arr[][4] = {{2,3},{4,5}};

注意:

花括号中的一个花括号代表一个一维数组的初始化。当里面无花括号分组时,按照顺序从第一个开始逐个进行初始化。余下的未赋值的元素用0初始化


五、二维数组的使用


二维数组的使用也是通过下标的方式,用双重循环嵌套进行索引使用。 看代码:

1. #include <stdio.h>
2. int main()
3. {
4.  int arr[3][4] = { 0 };
5.  int i = 0;
6.  for (i = 0; i < 3; i++)
7.  {
8.    int j = 0;
9.    for (j = 0; j < 4; j++)
10.     {
11.       arr[i][j] = i * 4 + j;
12.     }
13.   }
14.   for (i = 0; i < 3; i++)
15.   {
16.     int j = 0;
17.     for (j = 0; j < 4; j++)
18.     {
19.       printf("%d ", arr[i][j]);
20.     }
21.   }
22.   return 0;
23. }
相关文章
利用信号量实现线程顺序执行
【8月更文挑战第24天】本文介绍了如何运用信号量确保多线程程序中线程按预定顺序执行的方法。信号量作为同步机制,可有效控制共享资源访问,防止数据不一致。实现步骤包括:引入必要的头文件(如 `&lt;pthread.h&gt;` 和 `&lt;semaphore.h&gt;`),定义信号量变量(如 `sem_t` 类型),初始化信号量(通常第一个信号量设为1,其余设为0),以及创建线程(每个线程执行特定任务并释放相应信号量)。
160 1
|
2天前
|
SpringCloudAlibaba 负载均衡 Dubbo
微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?
本文对比分析了SpringCloudAlibaba框架下Feign与Dubbo的服务调用性能及差异。Feign基于HTTP协议,使用简单,适合轻量级微服务架构;Dubbo采用RPC通信,性能更优,支持丰富的服务治理功能。通过实际测试,Dubbo在调用性能、负载均衡和服务发现方面表现更出色。两者各有适用场景,可根据项目需求灵活选择。
336 123
微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?
|
1天前
|
Java 数据库 数据安全/隐私保护
Spring 微服务和多租户:处理多个客户端
本文介绍了如何在 Spring Boot 微服务架构中实现多租户。多租户允许单个应用实例为多个客户提供独立服务,尤其适用于 SaaS 应用。文章探讨了多租户的类型、优势与挑战,并详细说明了如何通过 Spring Boot 的灵活配置实现租户隔离、动态租户管理及数据源路由,同时确保数据安全与系统可扩展性。结合微服务的优势,开发者可以构建高效、可维护的多租户系统。
179 127
|
5天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
433 106
|
1天前
|
Web App开发 前端开发 API
在折叠屏应用中,如何处理不同屏幕尺寸和设备类型的样式兼容性?
在折叠屏应用中,如何处理不同屏幕尺寸和设备类型的样式兼容性?
212 124
|
5天前
|
JSON fastjson Java
FastJson 完全学习指南(初学者从零入门)
摘要:本文是FastJson的入门学习指南,主要内容包括: JSON基础:介绍JSON格式特点、键值对规则、数组和对象格式,以及嵌套结构的访问方式。FastJson是阿里巴巴开源的高性能JSON解析库,具有速度快、功能全、使用简单等优势,并介绍如何引入依赖,如何替换Springboot默认的JackJson。 核心API: 序列化:将Java对象转换为JSON字符串,演示对象、List和Map的序列化方法; 反序列化:将JSON字符串转回Java对象,展示基本对象转换方法;
|
6天前
|
缓存 JavaScript 前端开发
JavaScript 的三种引入方法详解
在网页开发中,JavaScript 可通过内联、内部脚本和外部脚本三种方式引入 HTML 文件,各具适用场景。本文详解其用法并附完整示例代码,帮助开发者根据项目需求选择合适的方式,提升代码维护性与开发效率。
211 110