【C语言】数组的基本知识详细讲解(一维数组、二维数组、越界、存储.....
接着上次的操作符的详解,让我们来简单了解C语言里的数组。
目录
-
一维数组的创建和初始化
1.数组的创建
数组是一组相同类型的元素的集合。
2.数组创建方式 :
type_t(数组类型) arr_name(数组名) [const_n](用来指定数组大小)
3.数组的初始化
数组的初始化是在其定义的时候就应该执行的,如:为5个已经知道的整形数据进行排序
//正确
int Arr[5] = { 1, 2, 3, 4, 5 };
//而不能用下面这种方式
int Arr[5];
Arr[5] = { 1, 2, 3, 4, 5 };
因为对于 Arr[5] = 来说,这是一个赋值操作,将右值赋值给左值,一切常数、字符和字符串都是右值。在这里 { 1, 2, 3, 4, 5 }; 并不是右值的一种,所以这是错误的。
另一个错误是,Arr[5] 下标为 5 这个元素实际上并不存在的属于数组的越界。
有数字类型的初始化,自然也有字符类型的初始化
字符类型初始化的两种方式:
char arr[5]={'a','b','c','d','e'};
char arr[5]= "abcde ";
1.空字符是字符串的终止符(空字符本身不是字符串的一部分,所以字符串的长度并不包含空字符)
2.操作字符串时,必须保证字符串以空字符( )结尾(不以空字符结尾的字符序列,不是字符串)。
-
一维数组的使用
1.例
用单引号形式初始化的数组代表只有这些数据,并且在末端不包含
总结
- 数组是使用下标来访问的,下标是从0开始。
- 数组的大小可以通过计算得到。
- Int sz = sizeof(arr)/sizeof(arr[0])
-
一维数组的存储
当我们定义了长度为5的整型数组,操作系统就会为其分配连续的五个内存地址。
这些地址用来存放数据,每一个地址所占的字节是数组的数据类型所决定的。
如int类型的每一个地址占据着4个字节,double类型的8个。
因为每个整形大小为四个字节,所以如图每个地址间隔为4。
讲完了一维数组的知识点,让我们简单了解一下二维数组
-
二维数组的创建与初始化
1.二维数组的创建
第一个括号指定行,第二个括号指定列
可以只对部分元素赋值,未赋值的元素自动取“零”值。例如:
int arr[3][4]={1,2,3,4,5}
2.二维数组的初始化
第一行:123 第二行:45
二维数组的列不能省略行可以在括号内大括号分割明确时省略
-
二维数组的存储
1.二维数组在内存中的存储
如果定义一个这样的二维数组int a[3][4]={undefined{1,3,5,7},{9,11,13,15},{17,19,21,23}};则其在内存中的表示可能下面这样的。
由上图可以看出,在内存中二维数组是按照行主序进行存储的,从内存的角度上看,二维数组本质就是一个一维数组。如果把二维数组的每一行看成一个整体,即看成一个数组中的一个元素,那么整个二维数组就是一个一维数组。而二维数组的名字代表二维数组第0行的首地址(注意它是代表一行元素的首地址,而不是第0行第0列元素的首地址,虽然是相等的,但不能这么理解,所以在没有强制转换的情况下,二维数据要么通过行指针进行参数传递,要么通过二维指针进行参数传递)。
-
数组的越界
这里讲的数组长度存在一个界,而一旦超过了这个大小,就会发生一些未知的错误,也就是所谓的越界
这里用一个例子来说明下越界后数组内部的值的情况:
根据代码可知,当数组越界后,其数值是不确定的。
-
总结
以上就是初阶数组的基本内容。如果你读到了这里,非常感谢你能看完的文章!!!
如果你觉得你有些想法和我一样,想和我一起提升自己可以关注私信我,与我一起进步,一起共同努力!!!!!
相关文章
- 【技术种草】cdn+轻量服务器+hugo=让博客“云原生”一下
- CLB运维&运营最佳实践 ---访问日志大洞察
- vnc方式登陆服务器
- 轻松学排序算法:眼睛直观感受几种常用排序算法
- 十二个经典的大数据项目
- 为什么使用 CDN 内容分发网络?
- 大数据——大数据默认端口号列表
- Weld 1.1.5.Final,JSR-299 的框架
- JavaFX 2012:彻底开源
- 提升as3程序性能的十大要点
- 通过凸面几何学进行独立于边际的在线多类学习
- 利用行动影响的规律性和部分已知的模型进行离线强化学习
- ModelLight:基于模型的交通信号控制的元强化学习
- 浅谈Visual Source Safe项目分支
- 基于先验知识的递归卡尔曼滤波的代理人联合状态和输入估计
- 结合网络结构和非线性恢复来提高声誉评估的性能
- 最佳实践丨云开发CloudBase多环境管理实践
- TimeVAE:用于生成多变量时间序列的变异自动编码器
- 具有线性阈值激活的神经网络:结构和算法
- 内网渗透之横向移动 -- 从域外向域内进行密码喷洒攻击