#### 数组
数组:一块连续的,大小固定并且里面的数据类型一致的内存空间,
如何声明一个数组:
```
数据类型 数组名称[长度];
```
数组只声明也不行啊,看一下数组是如何初始化的。说到初始化,C语言中的数组初始化是有三种形式的,分别是:
* 1、 数据类型 数组名称[长度n] = {元素1,元素2…元素n};
* 2、 数据类型 数组名称[] = {元素1,元素2…元素n};
* 3、 数据类型 数组名称[长度n]; 数组名称[0] = 元素1; 数组名称[1] = 元素2; 数组名称[n] = 元素n+1;
我们将数据放到数组中之后又如何获取数组中的元素呢?
```
获取数组元素时: 数组名称[元素所对应下标];
```
如:初始化一个数组 int arr[3] = {1,2,3}; 那么arr[0]就是元素1。
**注意:**
* **1、数组的下标均以0开始;**
* **2、数组在初始化的时候,数组内元素的个数不能大于声明的数组长度;**
* **3、如果采用第一种初始化方式,元素个数小于数组的长度时,多余的数组元素初始化为0;**
* **4、在声明数组后没有进行初始化的时候,静态(static)和外部(extern)类型的数组元素初始化元素为0,自动(auto)类型的数组的元素初始化值不确定。**
* **5、定义数组时,注意\[]不能放在数组名称前面,这和Java是不一样的**
#### 数组的遍历
数组就可以**采用循环的方式将每个元素遍历出来**,而不用人为的每次获取指定某个位置上的元素,例如我们用for循环遍历一个数组:
![](http://img.mukewang.com/54a26711000107b002220131.jpg)
数组遍历时要注意以下几点:
**1、最好避免出现数组越界访问,循环变量最好不要超出数组的长度**,比如:
![](http://img.mukewang.com/54a26e8a00019b8702920059.jpg)
**2、C语言的数组长度一经声明,长度就是固定,无法改变,并且C语言并不提供计算数组长度的方法。**
**3、如果 将int型变量定义在for循环内部,在C语言不同的编译器如code blocks会报错,然而在java中或者vs2015不报错如下代码所示**
```
#include <stdio.h>
int main()
{
int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
//补全代码实现对数组arr的遍历
//可以采用你自己喜欢的循环结果
//int i;
for(int i=0;i<10;i++)
{
printf("%d\n",arr[i]);
}
return 0;
}
```
![](http://img.mukewang.com/54a27d7b0001675d00460198.jpg)
而在java中不报错
![](http://i.imgur.com/uT5udYh.png)
> **由于C语言是没有检查数组长度改变或者数组越界的这个机制,可能会在编辑器中编译并通过,但是结果就不能肯定了,因此还是不要越界或者改变数组的长度**
#### 数组作为函数参数 ####
前面我们学过,变量可以当作参数是吧!这里数组也是可以当做函数的参数滴,啊?什么?你问数组咋当参数?请看下面知识。
**数组可以由整个数组当作函数的参数,也可以由数组中的某个元素当作函数的参数:**
1、**整个数组当作函数参数**,即把数组名称传入函数中,例如:
![](http://img.mukewang.com/54a9057e0001222e02520266.jpg)
2、数组中的元素当作函数参数,即**把数组中的参数传入函数**中,例如:
![](http://img.mukewang.com/54a906f8000130ff02540196.jpg)
**数组作为函数参数时注意以下事项:**
**1、数组名作为函数实参传递时,函数定义处作为接收参数的数组类型形参既可以指定长度也可以不指定长度。**
**2、数组元素作为函数实参传递时,数组元素类型必须与形参数据类型一致。**
#### 数组的应用(一)
数组咋排序?
排序的方法呢有很多,这里小编给大家介绍一种比较经典且比较容易掌握的排序方法:冒泡排序。
以升序排序为例**冒泡排序的思想:相邻元素两两比较,将较大的数字放在后面,直到将所有数字全部排序**。就像小学排队时按大小个排一样,将一个同学拉出来和后面的比比,如果高就放后面,一直把队伍排好。
班级成绩中,老师把前十名的挑出来了,用冒泡排序把分数排了一下
![](http://img.mukewang.com/54a287450001128305200600.jpg)
运行结果为
![](http://img.mukewang.com/54a287640001014003350070.jpg)
#### 数组的应用(二) ####
用数组查找功能,看看是否存在该数据,如果存在并返回该元素的下标。数组元素的查找也有很多查找方式,但是我们这里可以最简单的方式,通过遍历实现数组元素的查找。
比如以下程序实现在指定数组中查找指定元素的功能,如果找到该元素返回该元素的下标,否则返回-1:
![](http://img.mukewang.com/54a91369000145eb04860500.jpg)
#### 字符串与数组 ####
字符串是神马?字符串就是由多个字符组合而成的一段话。
在C语言中,是没有办法直接定义字符串数据类型的,但是我们可以使用数组来定义我们所要的字符串。一般有以下两种格式:
**1、char 字符串名称[长度] = "字符串值";**
**2、char 字符串名称[长度] = {'字符1','字符2',...,'字符n','\0'};**
注意:
* 1、[]中的长度是可以省略不写的;
* 2、采用第2种方式的时候最后一个元素必须是'\0','\0'表示字符串的结束标志;
* 3、采用第2种方式的时候在数组中不能写中文。
在输出字符串的时候要使用:`printf(“%s”,字符数组名字);`或者`puts(字符数组名字);`。例如:
![](http://img.mukewang.com/54aa4b6b0001b01d05520212.jpg)
运行结果为
![](http://img.mukewang.com/54aa4c3f0001883601340046.jpg)
#### 字符串函数
常用的字符串函数如下:
![](http://img.mukewang.com/54ab85e60001ce3d05690130.jpg)
使用字符串函数注意以下事项:
**1、strlen()获取字符串的长度,在字符串长度中是不包括‘\0’而且汉字和字母的长度是不一样的**。比如:
![](http://img.mukewang.com/54abb8910001fc6a05290083.jpg)
**2、strcmp()在比较的时候会把字符串先转换成ASCII码再进行比较,返回的结果为0表示s1和s2的ASCII码相等,返回结果为1表示s1比s2的ASCII码大,返回结果为-1表示s1比s2的ASCII码小,**例如:
![](http://img.mukewang.com/54abbd330001343606540142.jpg)
**3、strcpy()拷贝之后会覆盖原来字符串且不能对字符串常量进行拷贝**,比如:
![](http://img.mukewang.com/54abbcc40001d97c04720239.jpg)
**4、strcat在使用时s1与s2指的内存空间不能重叠,且s1要有足够的空间来容纳要复制的字符串,即在是是s1后面拼接s2**,如:
![](http://img.mukewang.com/54abccbc0001df3303280081.jpg)
#### 多维数组
多维数组就好比去超市买东西,用购物袋把所买商品分类存放,然后将所有的购物袋放到一个大的购物袋中,这样就形成了一个多维数组了。
**多维数组的定义格式**是:
```
数据类型 数组名称[常量表达式1][常量表达式2]...[常量表达式n];
```
例如:
![](http://img.mukewang.com/54acd58900019c5d03350026.jpg)
这样定义了一个名称为num,数据类型为int的二维数组。其中第一个[3]表示第一维下标的长度,就像购物时分类存放的购物;第二个[3]表示第二维下标的长度,就像每个购物袋中的元素。
我们可以把上面的数组看作一个3×3的矩阵,如下图:
![](http://img.mukewang.com/54acf121000152ce03600100.jpg)
多维数组的初始化与一维数组的初始化类似也是分两种:
* 1、`数据类型 数组名称[常量表达式1][常量表达式2]...[常量表达式n] = {{值1,..,值n},{值1,..,值n},...,{值1,..,值n}};`
* 2、`数据类型 数组名称[常量表达式1][常量表达式2]...[常量表达式n]; 数组名称[下标1][下标2]...[下标n] = 值;`
**多维数组初始化要注意以下事项:**
* **1、采用第一种始化时数组声明必须指定列的维数。因为系统会根据数组中元素的总个数来分配空间,当知道元素总个数以及列的维数后,会直接计算出行的维数;**
* **2、采用第二种初始化时数组声明必须同时指定行和列的维数。**
#### 多维数组的遍历 ####
多维数组也是存在遍历的,和一维数组遍历一样,也是需要用到循环。**不一样的就是多维数组需要采用嵌套循环**,如:遍历输出int num[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
![](http://img.mukewang.com/54ad004f000168ee05750247.jpg)
**注意:多维数组的每一维下标均不能越界**
### 内存地址的概念
* 声明一个变量,就会立即为这个变量申请内存,一定会有一个对应的内存地址
* 没有地址的内存是无法使用的
* 内存的每一个字节都有一个对应的地址
* 内存地址用一个16进制数来表示
* 32位操作系统最大可以支持4G内存
* 32位系统的地址总线为32位,也就是说系统有2^32个数字可以分配给内存作为地址使用
- 前言
- JNI基础知识
- C语言知识点总结
- ①基本语法
- ②数据类型
- 枚举类型
- 自定义类型(类型定义)
- ③格式化输入输出
- printf函数
- scanf函数
- 编程规范
- ④变量和常量
- 局部变量和外部变量
- ⑤类型转换
- ⑥运算符
- ⑦结构语句
- 1、分支结构(选择语句)
- 2、循环结构
- 退出循环
- break语句
- continue语句
- goto语句
- ⑧函数
- 函数的定义和调用
- 参数
- 函数的返回值
- 递归函数
- 零起点学通C语言摘要
- 内部函数和外部函数
- 变量存储类别
- ⑨数组
- 指针
- 结构体
- 联合体(共用体)
- 预处理器
- 预处理器的工作原理
- 预处理指令
- 宏定义
- 简单的宏
- 带参数的宏
- 预定义宏
- 文件包含
- 条件编译
- 内存中的数据
- C语言读文件和写文件
- JNI知识点总结
- 前情回顾
- JNI规范
- jni开发
- jni开发中常见的错误
- JNI实战演练
- C++(CPP)在Android开发中的应用
- 掘金网友总结的音视频开发知识
- 音视频学习一、C 语言入门
- 1.程序结构
- 2. 基本语法
- 3. 数据类型
- 4. 变量
- 5. 常量
- 6. 存储类型关键字
- 7. 运算符
- 8. 判断
- 9. 循环
- 10. 函数
- 11. 作用域规则
- 12. 数组
- 13. 枚举
- 14. 指针
- 15. 函数指针与回调函数
- 16. 字符串
- 17. 结构体
- 18. 共用体
- 19. typedef
- 20. 输入 & 输出
- 21.文件读写
- 22. 预处理器
- 23.头文件
- 24. 强制类型转换
- 25. 错误处理
- 26. 递归
- 27. 可变参数
- 28. 内存管理
- 29. 命令行参数
- 总结
- 音视频学习二 、C++ 语言入门
- 1. 基本语法
- 2. C++ 关键字
- 3. 数据类型
- 4. 变量类型
- 5. 变量作用域
- 6. 常量
- 7. 修饰符类型
- 8. 存储类
- 9. 运算符
- 10. 循环
- 11. 判断
- 12. 函数
- 13. 数学运算
- 14. 数组
- 15. 字符串
- 16. 指针
- 17. 引用
- 18. 日期 & 时间
- 19. 输入输出
- 20. 数据结构
- 21. 类 & 对象
- 22. 继承
- 23. 重载运算符和重载函数
- 24. 多态
- 25. 数据封装
- 26. 接口(抽象类)
- 27. 文件和流
- 28. 异常处理
- 29. 动态内存
- 30. 命名空间
- 31. 预处理器
- 32. 多线程
- 总结
- 音视频学习 (三) JNI 从入门到掌握
- 音视频学习 (四) 交叉编译动态库、静态库的入门学习
- 音视频学习 (五) Shell 脚本入门
- 音视频学习 (六) 一键编译 32/64 位 FFmpeg 4.2.2
- 音视频学习 (七) 掌握音频基础知识并使用 AudioTrack、OpenSL ES 渲染 PCM 数据
- 音视频学习 (八) 掌握视频基础知识并使用 OpenGL ES 2.0 渲染 YUV 数据
- 音视频学习 (九) 从 0 ~ 1 开发一款 Android 端播放器(支持多协议网络拉流/本地文件)
- 音视频学习 (十) 基于 Nginx 搭建(rtmp、http)直播服务器
- 音视频学习 (十一) Android 端实现 rtmp 推流
- 音视频学习 (十二) 基于 FFmpeg + OpenSLES 实现音频万能播放器
- 音视频学习 (十三) Android 中通过 FFmpeg 命令对音视频编辑处理(已开源)