如何自助建网站,包头网站建设哪家好,深圳市网站建设科技公司,评价一个网站的优缺点一维数组的创建和初始化
数组是一组相同类型元素的集合。
数组的创建
//数组的创建方式#xff1a;type_t arr_name [const_n];//type_t 是指数组的元素类型//const_n 是一个常量表达式#xff0c;用来指定数组的大小数组创建的实例#xff1a;
数组创建#xff…一维数组的创建和初始化
数组是一组相同类型元素的集合。
数组的创建
//数组的创建方式type_t arr_name [const_n];//type_t 是指数组的元素类型//const_n 是一个常量表达式用来指定数组的大小数组创建的实例
数组创建在C99标准之前 [] 中要给一个常量才可以不能使用变量。
#define _CRT_SECURE_NO_WARNINGS
#includestdio.hint main()
{int arr1[5];char arr2[8];float arr3[15];double arr4[10];return 0;
}C99标准引入了变长数组的概念数组的大小可以使用变量指定但是在VS中数组不能初始化。
#define _CRT_SECURE_NO_WARNINGS
#includestdio.hint main()
{n 10;int arr[n];return 0;
}数组的初始化
数组的初始化是指在创建数组的同时给数组的内容一些合理初始值初始化。
#define _CRT_SECURE_NO_WARNINGS
#includestdio.hint main()
{int arr1[10] { 1,2,3,4,5,6,7,8,9,10 };//完全初始化int arr2[10] { 1,2,3,4,5 };//不完全初始化剩余部分默认初始化为零char arr3[10] { a,b, 99 };//字符类型数组默认将数字对应为字符的ASCLL码值char arr4[10] abcdef;//不完全初始化剩余部分默认初始化为‘\0’//如果数组初始化了可以不指定数组的大小数组大小会根据初始化的内容来决定char arr5[] { a,b, 99 };char arr6[] abc;return 0;
}一维数组的使用
对于数组的使用介绍一个操作符 [ ] (下标引用操作符)。它其实就是数组访问的操作符。
#define _CRT_SECURE_NO_WARNINGS
#includestdio.hint main()
{int arr[10] { 0 };//数组的不完全初始化//计算数组的元素个数int sz sizeof(arr) / sizeof(arr[0]);//对数组内容赋值,数组是使用下标来访问的下标从0开始。所以int i 0;//做下标for (i 0; i 10; i){arr[i] i;}//输出数组的内容for (i 0; i 10; i){printf(%d , arr[i]);}return 0;
}总结: 数组是使用下标来访问的下标是从0开始。 数组也是有类型的去掉数组名就是数组的类型。 数组的大小可以通过计算得到。
int arr[10];
int sz sizeof(arr)/sizeof(arr[0]);一维数组在内存中的存储 仔细观察输出的结果我们知道随着数组下标的增长元素的地址也在有规律的递增。由此可以得出结论 数组在内存中是连续存放的。 随着下标的增长地址是由低到高变化的。
因此我们只要拿到首元素地址就相当于知道了所有元素的地址。
二维数组的创建和初始化
二维数组的创建
//数组创建
int arr[3][4]; //3行4列
char arr[3][5]; //3行5列我们想象中的多维数组是这样的
二维数组的初始化
//数组初始化
int arr[3][4] {1,2,3,4}; //不完全初始化
int arr[2][4] {{1,2},{4,5}}; //不完全初始化
int arr[][4] {{2,3},{4,5}}; //不完全初始化
//二维数组如果有初始化行可以省略列不能省略二维数组的使用
二维数组的使用也是通过下标的方式行和列的下标都是从零开始的。
二维数组在内存中的存储 我们惊奇的发现二维数组在换行时地址还是增加4个字节这说明了二维数组在内存中还是连续存放的。
如果把二维数组的每一行看作一个一维数组那么每一行的一维数组也有数组名
arr[0]就是第一行的数组名arr[1]就是第二行的数组名arr[3]就是第三行的数组名以此类推。
数组越界
数组的下标是有范围限制的。
数组的下标规定是从0开始的如果数组有n个元素最后一个元素的下标就是n-1。
所以数组的下标如果小于0或者大于n-1就是数组越界访问了超出了数组合法空间的访问。C语言本身是不做数组下标的越界检查编译器也不一定报错但是编译器不报错并不意味着程序就是正确的所以我们在写代码时最好自己做越界的。 同样的二维数组的行和列也可能存在越界。
数组作为函数参数
往往我们在写代码的时候会将数组作为参数传个函数比如我要实现一个冒泡排序这里要讲解的是算法思想函数将一个整形数组排序。
冒泡排序函数的错误设计
#include stdio.h
void bubble_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 - i - 1; j){if (arr[j] arr[j 1]){int tmp arr[j];arr[j] arr[j 1];arr[j 1] tmp;}}}
}
int main()
{int arr[] { 3,1,7,5,8,9,0,2,4,6 };//排升序//冒泡排序bubble_sort(arr);int i 0;for (i 0; i 10; i){printf(%d , arr[i]);}return 0;
}调试之后可以看到 bubble_sort 函数内部的 sz 是1。难道数组作为函数参数的时候不是把整个数组的传递过去?
数组名是什么
数组名是数组首元素的地址。 有两个例外
sizeof(数组名)计算整个数组的大小sizeof内部单独放一个数组名数组名表示整个数 组。数组名取出的是数组的地址。数组名数组名表示整个数组。
除此1,2两种情况之外所有的数组名都表示数组首元素的地址。
冒泡排序函数的正确设计
当数组传参的时候实际上只是把数组的首元素的地址传递过去了。
所以即使在函数参数部分写成数组的形式 int arr[] 表示的依然是一个指针 int *arr 。
那么函数内部的 sizeof(arr) 结果是 4/8。
#include stdio.h
void bubble_sort(int arr[],int sz)//int arr[]本质上是指针int* arr来接收地址
{int i 0;//冒泡排序的趟数for (i 0; i sz - 1; i){int j 0;//一趟冒泡排序for (j 0; j sz - i - 1; j){if (arr[j] arr[j 1]){int tmp arr[j];arr[j] arr[j 1];arr[j 1] tmp;}}}
}
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);//arr是数组首元素地址int i 0;for (i 0; i 10; i){printf(%d , arr[i]);}return 0;
}数组的应用实例三子棋
数组的应用实例扫雷游戏