ppt模板之家官网,吉林seo网络推广,淄博临淄网站建设,郑州app网站公司1. 一维数组的创建和初始化
1.1 数组的创建
数组是一组相同类型元素的集合。 数组的创建方式#xff1a;
type_t arr_name [const_n];
//type_t 是指数组的元素类型
//const_n 是一个常量表达式#xff0c;用来指定数组的大小
数组创建的实例#xff1a;
//代码1
int a…1. 一维数组的创建和初始化
1.1 数组的创建
数组是一组相同类型元素的集合。 数组的创建方式
type_t arr_name [const_n];
//type_t 是指数组的元素类型
//const_n 是一个常量表达式用来指定数组的大小
数组创建的实例
//代码1
int arr1[10];
//代码2
int count 10;
int arr2[count];//数组时候可以正常创建
//代码3
char arr3[10];
float arr4[1];
double arr5[20];
注数组创建在C99标准之前 [] 中要给一个常量才可以不能使用变量。在C99标准支持了变长数组的概念。
1.2 数组的初始化
数组的初始化是指在创建数组的同时给数组的内容一些合理初始值初始化。 看代码
第一种初始化被称为不完全初始化因为只初始化了一部分那么剩余的一部分就会默认初始化为0。
第二种初始化则默认这个数组为4个元素。
第三种则是标准的初始化。
第四种是字符数组可以理解为这个数组里面放了三个字符98的ASCLL码值为abc。
第五种则是默认3个元素的字符数组。
第六种是使用字符串进行初始化和第五种的区别在于字符串末尾会有一个\0。
int arr1[10] {1,2,3};
int arr2[] {1,2,3,4};
int arr3[5] {12345}
char arr4[3] {a,98, c};
char arr5[] {a,b,c};
char arr6[] abcdef;
数组在创建的时候如果想不指定数组的确定的大小就得初始化。数组的元素个数根据初始化的内容来确定。 但是对于下面的代码要区分内存中如何分配。
char arr1[] abc;
char arr2[3] {a,b,c};
1.3 一维数组的使用
对于数组的使用我们之前介绍了一个操作符 [] 下标引用操作符。它其实就数组访问的操作符。 我们来看代码
#define _CRT_SECURE_NO_WARNINGS 1
#includestdio.h
int main()
{int arr[10] { 0 };//数组的不完全初始化//计算数组的元素个数int sz sizeof(arr) / sizeof(arr[0]);//对数组内容赋值,数组是使用下标来访问的下标从0开始。所以int i 0;//做下标for (i 0; i 10; i)//这里写10好不好{arr[i] i;}//输出数组的内容for (i 0; i 10; i){printf(%d , arr[i]);}return 0;
} 需要注意的是下标是从0开始的所以i10则是10次。 总结: 1. 数组是使用下标来访问的下标是从0开始。 2. 数组的大小可以通过计算得到。
int arr[10];
int sz sizeof(arr)/sizeof(arr[0]);
1.4 一维数组在内存中的存储
接下来我们探讨数组在内存中的存储。 看代码
#define _CRT_SECURE_NO_WARNINGS 1
#includestdio.h
int main()
{int arr[10] { 0 };int i 0;int sz sizeof(arr) / sizeof(arr[0]);for (i 0; i sz; i){printf(arr[%d] %p\n, i, arr[i]);}return 0;
}
在x86的环境下结果是这样的 仔细观察输出的结果我们知道随着数组下标的增长元素的地址也在有规律的递增。为什么差的是4呢因为一个整形元素是4个字节每个字节都有一个地址。由此可以得出结论数组在内存中是连续存放的。 数组的这种布局是为了内存的访问因为当我们知道了一个数组的起始位置往后遍历就能找到后面的所有元素为使用指针访问数组带来了很大的便利。
2. 二维数组的创建和初始化
2.1 二维数组的创建
二维数组相当于存放行和列。
//数组创建
int arr[3][4];
char arr[3][5];
double arr[2][4];
2.2 二维数组的初始化
第二种初始化相当于{1200}{4500}{0000}。
//数组初始化
int arr[3][4] {1,2,3,4};
int arr[3][4] {{1,2},{4,5}};
int arr[][4] {{2,3},{4,5}};//二维数组如果有初始化行可以省略列不能省略
2.3 二维数组的使用
二维数组的使用也是通过下标的方式。 看代码
#define _CRT_SECURE_NO_WARNINGS 1
#include stdio.h
int main()
{int arr[3][4] { 0 };int i 0;for (i 0; i 3; i){int j 0;for (j 0; j 4; j){arr[i][j] i * 4 j;}}for (i 0; i 3; i){int j 0;for (j 0; j 4; j){printf(%d , arr[i][j]);}}return 0;
} 2.4 二维数组在内存中的存储
像一维数组一样这里我们尝试打印二维数组的每个元素。
#define _CRT_SECURE_NO_WARNINGS 1
#include stdio.h
int main()
{int arr[3][4];int i 0;for (i 0; i 3; i){int j 0;for (j 0; j 4; j){printf(arr[%d][%d] %p\n, i, j, arr[i][j]);}}return 0;
} 通过结果我们可以分析到其实二维数组在内存中也是连续存储的二维数组存储的时候是存完第一行再存第二行。 3. 数组越界
数组的下标是有范围限制的。 数组的下规定是从0开始的如果数组有n个元素最后一个元素的下标就是n-1。 所以数组的下标如果小于0或者大于n-1就是数组越界访问了超出了数组合法空间的访问。 C语言本身是不做数组下标的越界检查编译器也不一定报错但是编译器不报错并不意味着程序就是正确的所以程序员写代码时最好自己做越界的检查。
#define _CRT_SECURE_NO_WARNINGS 1
#include stdio.h
int main()
{int arr[10] { 1,2,3,4,5,6,7,8,9,10 };int i 0;for (i 0; i 10; i){printf(%d\n, arr[i]);//当i等于10的时候越界访问了}return 0;
} 这就属于数组的越界访问了因为这个数组是10个元素但是却访问了11次。
4. 数组作为函数参数
往往我们在写代码的时候会将数组作为参数传个函数比如我要实现一个冒泡排序函数, 将一个整形数组排序。
那我们将会这样使用该函数
4.1 冒泡排序函数的错误设计
#define _CRT_SECURE_NO_WARNINGS 1
#includestdio.h
void 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[] { 1,2,3,4,5,6,7,8,9,10 };sort(arr);int i 0;for (i 0; i 10; i){printf(%d , arr[i]);}return 0;
}当我们这样去设计函数就会发现答案是错误的。
4.2 数组名是什么
#include stdio.h
int main()
{int arr[10] {1,23,4,5};printf(%p\n, arr);printf(%p\n, arr[0]);printf(%d\n, *arr);//输出结果return 0;
}
数组名是数组首元素的地址。有两个例外
1. sizeof(数组名)计算整个数组的大小sizeof内部单独放一个数组名数组名表示整个数 组。 2. 数组名取出的是数组的地址。数组名数组名表示整个数组。
除此1,2两种情况之外所有的数组名都表示数组首元素的地址。
4.3 冒泡排序函数的正确设计
当数组传参的时候实际上只是把数组的首元素的地址传递过去了。 所以即使在函数参数部分写成数组的形式 int arr[] 表示的依然是一个指针 int *arr 。 那么函数内部的 sizeof(arr) 结果是4。
#define _CRT_SECURE_NO_WARNINGS 1
#includestdio.h
void bubble_sort(int arr[], int sz)//参数接收数组元素个数
{//代码同上面函数
}
int main()
{int arr[] { 3,1,7,5,8,9,0,2,4,6 };int sz sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz);//是否可以正常排序for (i 0; i sz; i){printf(%d , arr[i]);}return 0;
}
这才是正确的冒泡排序函数方法我们把元素个数作为参数传给函数。
5. 数据实例
5.1 数组的应用实例1三子棋
http://t.csdn.cn/OEdsa
5.2 数组的应用实例2扫雷
http://t.csdn.cn/6NpQq
我的这两篇文章有详解哦欢迎大家阅读。 今天的分享到这里就结束啦感谢烙铁们的阅读让我们下一篇文章再见下一篇文章会详细的给大家讲解操作符哦