目录

一、一维数组

1、一维数组的创建(定义)

2、一维数组的初始化

3、一维数组的内存分配

二、二维数组

1、二维数组的创建(定义)

2、二维数组的初始化

3、二维数组的内存分配

三、数组越界

四、详解数组名


一、一维数组

1、一维数组的创建(定义)

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

数组的创建(定义):

 <数据类型>       <数组名><[常量表达式]>;

数据类型:是指数组的元素类型(对于同一个数组,其所有元素的数据类型都是相同的)

常量表达式:用来指定数组的大小(元素个数×类型大小)

数组名:自定义的数组名字,可以由字母、数字和下划线组成,但要注意不能以数字开头

2、一维数组的初始化

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

数组的初始化有7种情况:

①局部数组不初始化

对于普通局部数组,若定义时没有初始化,则数组中元素的值是随机的。

#include <stdio.h>int main()
{int arr[1];//为了方便演示,创建了一个只有1个元素的数组printf("%d\n",arr[0]);//打印这一个元素的值return 0;
}

②static数组不初始化

对于static修饰的数组,若定义时没有初始化,则数组中元素的值默认为0。

#include <stdio.h>
int main()
{static int arr[1];//static修饰的数组printf("%d\n", arr[0]);return 0;
}

输出结果为0。

③全局数组不初始化

对于全局数组,若定义时没有初始化,则数组中元素的值默认也为0(偷懒就不举例验证了qaq)。

④全部初始化

与变量在定义时初始化一样,数组也可以在定义时进行初始化,如对整形数组进行初始化。

需要注意:定义数组时,对数组元素的初始化,只能写成一行,不能换行写,下面是错误示范: 

⑤部分初始化

数组在定义时可以对其中的部分数据进行初始化,当{}中值的个数少于元素个数时,只给前面部分元素赋值,后面未赋值元素自动赋0。

⑥数组全部赋值

若对数组全部赋值,则可以省略数组下标中的常量。

⑦数组全部初始化为0

以上就是数组初始化的7种情况,需要注意的是:数组的元素是不能整体赋值的,只能单个赋值,如int arr[3] = {4};则只为该数组真的第一个元素(arr[0])赋值。

3、一维数组的内存分配

在内存中,数组中的元素占用连续的存储空间,并且根据单个元素所占存储空间来进行内存分配。数组名代表数组的起始地址,是地址常量,对数组名求sizeof,可以得出数组占用的总空间。从此我们可以利用数组总空间求出元素个数。

数组元素个数 = sizeof(数组名)/ sizeof(数据类型)

接下来我们通过一段代码来应用一下,在进一步看看每个元素的地址:

include <stdio.h>int main()
{int arr[5] = { 0 };int i;int sz = sizeof(arr) / sizeof(arr[0]);//求出元素个数for (i = 0; i < sz; i++){printf("arr[%d] = %p\n", i,&arr[i]);//打印出每个元素的地址}return 0;
}

仔细观察输出的结果,我们发现,随着数组下标的增长,元素的地址也是有规律(数据类型大小的增长)的递增。

二、二维数组

1、二维数组的创建(定义)

一维数组只有一个下标。具有两个下标的数组,就称为二维数组。二维数组元素有两个下标,以标识它在数组中的位置。二维数组的说明与一维数组的说明基本类似,其形式如下:

<数据类型>     <数组名><[常量表达式1]><[常量表达式2]>;

eg:int arr[3][4];说明这是一个2行3例的数组。(同一维数组一样从下标[0]开始的)

可以看出,二维数组只是比一维数组多了一个下标,其他特性与一维数组相同。

2、二维数组的初始化

二维数组的初始化与一维数组基本类似,主要有以下形式:

①降维给二维数组赋初值,即按行初始化。每一组的初始化都用{}括起来。

int arr[2][3] = {{1,2,3},{4,5,6}};
//按降维给arr数组全部初始化,第一行为1,2,3。第二行为4,5,6
int arr1[2][3] = {{1},{4}};
//部分初始化,其他元素为0。第一行为1,0,0。第二行为4,0,0

②按线性存储的形式给二维数组赋初值

int arr[2][3] = {1,2,3,4,5,6};
//按线性存储方式给arr数组全部初始化,第一行为1,2,3。第二行为4,5,6
int arr1[2][3] = {1,4};
//部分初始化,其他元素为0。第一行为1,4,0。第二行为0,0,0

③可以省略下标的方式,给二维数组赋初值

int arr[][3] = {1,2,3,4,5,6};
//省略第一维的长度,给数组赋值(上面2种方法都可以)

        这里需要注意,第一维长度可以省略,第二维长度坚决不能省略。如int arr[3][ ];int arr[ ] [ ];这两种都是错的。

3、二维数组的内存分配

二维数组在概念上是二维的,也就是称其两个下标为行和列。但是内存确是按照一维线性排列的,二维数组如何在内存中存储,我们通过以下代码了解:

#include <stdio.h>int main()
{int arr[3][4] = {0};int i, j;for (i = 0; i < 3; i++){for (j = 0; j < 4; j++){printf("arr[%d][%d] = %p\n", i,j,&arr[i][j]);}}return 0;
}

通过结果我们可以看出,其实二维数组同一维数组一样,在内存中也是连续存储的。

三、数组越界

数组的下标是有范围限制的,数组的下标规定是从0开始的,通过我们之前的代码可以看出,如果数组有n个元素,那么在最后一个元素的下标就是n-1。

如果我们在写代码时数组的下标小于0或者大于n-1,那么就是数组越界访问了,超出了数组合法空间的访问。

eg:  int  arr[5] = {1,2,3,4,5,6};

二维数组的行和列同样存在越界。

四、详解数组名

由上图可以看出,数组名就是数组首元素的地址。但是有两个例外。

1、sizeof(arr),这里的数组名arr表示整个数组,sizeof(arr)是在计算整个数组的大小(字节)。

2、&arr,数组名表示的是整个数组,求出来的是整个数组的地址。我们通过代码来验证一下这个说法:

int main()
{int arr[3] = {1,2,3};printf("     arr = %p\n", &arr);//1printf("  arr[0] = %p\n", arr);//2printf(" &arr[0] = %p\n", &arr[0]);//3printf("&arr + 1 = %p\n", &arr + 1);//4printf(" arr + 1 = %p\n", arr + 1);//5return 0;
}

代码1,2,3输出结果是一样的,但是第一个&arr取出的是整个数组的地址,和2,3的意义完全不一样的,2,3是首元素的地址。我们通过4,5输出结果可以验证我们的结论,4输出的结果比1输出结果多了12字节(这个数组的大小),5输出的结果比2多了4字节(一个元素的大小)。

【C语言】数组(一维数组、二维数组)相关推荐

  1. c语言一维数组转化为二维矩阵,js将一维数组转化为二维数组

    遇到的问题: 后端返回的是一组一维数组,但是需要展示的格式是二维数组,常见的场景举例:后台返回10个长度的数组,需要分成3个一组展示在banner上. 例:[1,2,3,4,5,6,7,8,9,10] ...

  2. 【C 语言】数组 ( 一维数组形参退化 | 二维数组形参退化 | 函数形参等价关系 )

    文章目录 一.一维数组形参退化 二.二维数组形参退化 三.数组形参等价关系 一.一维数组形参退化 C 中将 一维数组 作为参数 , 传递到函数中 , 该 一维数组 会退化为 指针 ; 将 int ar ...

  3. 【C 语言】数组 ( 验证二维数组内存是线性的 | 打印二维数组 | 以一维数组方式打印二维数组 | 打印二维数组值和地址 )

    文章目录 一.验证二维数组内存是线性的 1.打印二维数组 2.以一维数组方式打印二维数组 3.打印二维数组值和地址 二.完整代码示例 一.验证二维数组内存是线性的 验证二维数组内存是线性的 : 验证方 ...

  4. c 语言 二维数组地址,C/C++ 关于一维或二维数组首地址表示含义

    C/C++ 关于一维或二维数组首地址表示含义 发布时间:2020-06-26 10:35:21 来源:51CTO 阅读:210 作者:sonissa 这是一个经常会忘却的知识点,最近也一直在吃这方面的 ...

  5. c语言中二维数组怎么,c语言中什么是二维数组

    c语言中什么是二维数组 二维数组A[m][n],这是一个m行,n列的二维数组.以下是由应届毕业生小编整理关于c语言二维数组的内容,希望对大家有所帮助!更多相关内容请关注应届毕业生考试 网. c语言的二 ...

  6. 指针:C语言二级指针与二维数组

    前言   最近用C语言写LeetCode 有的题目给的函数把二维数组用二级指针传进来 并传入行数和列数 引起一些疑惑 本来以为C语言学得海星,查了一些资料后,觉得自己还是个弟弟 : (   按一维数组 ...

  7. oracle 一维数转二维数组,js将一维数组转化为二维数组

    遇到的问题: 后端返回的是一组一维数组,但是需要展示的格式是二维数组,常见的场景举例:后台返回10个长度的数组,需要分成3个一组展示在banner上. 例:[1,2,3,4,5,6,7,8,9,10] ...

  8. c语言中定义字母二维数组,C语言 | 数组

    原标题:C语言 | 数组 1. 一维数组的定义和使用通过对前面知识的学习,我们已经知道如何定义和使用一个一个的各种变量,但总有不够用的时候.举个例子,我要记录一个班32个同学C语言这科的成绩,难道要定 ...

  9. C语言定义和引用二维数组

    怎样定义和引用二维数组 二维数组常称为矩阵.把二维数组写成行(row)和列(column)的排列形式,可以有助于形象地理解二维数组的逻辑结构. 一.怎样定义二维数组 其基本概念与方法与一维数组相似,如 ...

  10. php获取一维,二维数组长度的方法(有实例)

    在php中获取数组长度方法很简单,php为我们提供了两个函数可以计算一维数组长度,如count,sizeof都可以直接统计数组长度哦,下面我们来看几个实例吧. php如何获取数组的长度,使用php函数 ...

最新文章

  1. 基础通俗讲解集成学习算法
  2. 【Linux 内核】进程管理 task_struct 结构体 ② ( state 字段 | stack 字段 | pid 字段 | tgid 字段 | pid_links 字段 )
  3. Flask之threading.loacl方法
  4. Spring Boot 2.x(六):优雅的统一返回值
  5. 单片机小精灵t2_搭建S5P4418 ARM环境下 GPU OPENGL ES开发环境(适用 NANOPI2,3,M2,M3,T2,T3)...
  6. mb_internal_encoding php,PHP字符串mbstring处理中文字符串的具体方法解析
  7. linux那些事之中断与异常(AMD64架构)_2
  8. Java高并发编程详解系列-单线程执行设计模式
  9. mysql 10658_数据库mysql语句 - pymysql,sqlite3,MySQLdb,mysql.connector 第三方库常用sql语句...
  10. perl语言hello world程序
  11. 微软雅黑的问题(for silverlight)
  12. 【VFB】复制VB代码(VB与FB的差异)(VFB教程3-6)
  13. 锐捷交换机基本功能配置
  14. word硬回车是怎么产生的_怎么将word文档中的软回车替换成硬回车
  15. CNN编辑:扯淡的WSJ,你们专黑Groupon三十年!
  16. win7、win10安装Microsoft Loopback 接口
  17. 正则表达式--文本处理神器
  18. PLC程序实例三:ModBusRTU客户端编程实例与测试方法
  19. ASP.Net发送邮箱验证
  20. try/catch 用法

热门文章

  1. 理解CPU/寄存器/内存之间的关系
  2. 简明解释算法中的大O符号
  3. 李宏毅2020机器学习深度学习 笔记1(理论上持续更新中)
  4. Next.js性能优化之ISR渲染入门和原理探索
  5. Linux alias查看/设置 命令别名
  6. 千峰python线下培训
  7. 键盘的 SysRq按键使用详解
  8. Mock服务(1)---- 初识Mock
  9. QT 安装 配置过程
  10. JavaScript中的经典题型(类数组、CSS Sprites、事件委托、经典去重、原型链、闭包、深浅克隆、附带思路流程和源码)