------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
一数组的定义
1, 数组就是一些数据或变量的按照一定顺序排列的一个集合
2, 数组是一个统称, 里面的每一个具体的变量称为元素
3, 数组中每一个变量的位置是确定, 使用从 0 开始的序号进行访问
这个需要称为"下标"或"索引"
4, 一维数组
如果有一个数组, 而数组中每一个元素都是一个简单的数据类型, 即不是一个数组
那么就称该数组为一维数组
5, 在 C 语言中不直接支持 二维数组
而是利用一个元素为 一维数组 的 "一维数组" 来描述二维数组
二数组的语法:
数据类型 数组名 [ 元素个数 ];
1) 数据类型, 表示数组元素的类型是什么, 一个数组只允许存储一种数据类型的多个变量
2) 数组名就是标识符
3) 元素个数不允许是浮点数, 必须是整数或整数表达式
补充: ANSI C 不允许个数是变量, C99 中允许使用变量
三数组的初始化
1, 对数组元素的初始化
1.1 先定义再初始化
int nums[2];
nums[0] = 1;
nums[1] = 23;
1.2 定义数组的同时进行初始化
int nums[2] = { 1, 2 };
补充: 数组的初始化方式很多
不完全初始化, 没有初始化的变量默认为 0
int nums[10] = { 1, 2 };
省略数组元素个数, 编译器会根据初始化使用的数据个数类自动的提供元素个数
int nums[] = { 1, 2, 3, 4 };
2, 使用数组中的元素
2.1 使用其中的某一个变量
数组名[下标]
2.2 遍历, 所谓的遍历就是将数组元素一个一个取出来使用
int array[] = { 1, 2, 33, 44, 555 ,6666 , 777};
for (int i = 0; i < 7; i++) {
printf("%d\n", array[i]);
}
3, 直接使用 for 循环初始化
int length;
printf("请输入数组元素的个数\n");
scanf("%d", &length);
int array[length];
for (int i = 0; i < length; i++) {
printf("请输入 第%d个数字\n", i + 1);
scanf("%d", &array[i]);
}
for (int i = 0; i < length; i++) {
printf("输入的第 %d 个数字是 %d \n", i + 1, array[i]);
}
四数组的综合运用
1定义变量,初始化数组, 遍历数组,以及统计数据
int sum, max, min;
double avg;
sum = max = min = array[0];
for (int i = 1; i < length; i++) {
sum += array[i];
if (max < array[i]) {
max = array[i];
}
if (min > array[i]) {
min = array[i];
}
}
avg = 1.0 * sum / length;
printf("min = %d\n", min);
printf("max = %d\n", max);
printf("sum = %d\n", sum);
printf("avg = %.2f\n", avg);
2数组元素作为函数参数
#include <stdio.h>
void printSquare(int num) {
num *= num;
printf("%d\n", num);
}
int main(int argc, const char * argv[]) {
int nums[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (int i = 0; i < 9; i++) {
printSquare(nums[i]);
}
printf("===\n");
for (int i = 0; i < 9; i++) {
printf("main-----%d\n", nums[i]);
}
return 0;
}
3用数组名字作为函数参数
3.1 将数组作为函数参数进行传递, 传递的内容是数组的首地址
因此长度信息会丢失, 所以函数需要第二个参数表示数组的长度
因此函数模型为:
void func(int arr[], int length) {
...
}
由于传递的是地址, 在函数中声明的变量参数, 存储了数组的地址
使用下标访问的元素, 与 mian 函数中数组定义的元素就是同一个元素
因此得到一个结论
在函数中直接修改数组元素, 函数外的数组元素跟着修改
#include <stdio.h>
#define LEN 10
void func(int address[], int length) {
for (int i = 0; i < length; i++) {
printf("---%d---\n", address[i]);
}
}
int main(int argc, const char * argv[]) {
int arr[LEN] = {1, 2, 3, 4, 5 ,6 ,7 ,8 ,9 ,0};
func(arr, LEN);
return 0;
}
3.2用函数来遍历数组
初始化, 函数里和函数外是"同一个数组"
第一一个数组,遍历出来
#include <stdio.h>
#define LEN 10
void initIntArray(int arr[], int length) {
for (int i = 0; i < length; i++) {
printf("请输入第 %d 个数字\n", i + 1);
scanf("%d", &arr[i]);
}
}
void foreachIntArray(int array[], int length) {
for (int i = 0; i < length; i++) {
printf("%d\n", array[i]);
}
}
int main(int argc, const char * argv[]) {
int array[LEN];
initIntArray(array, LEN);
foreachIntArray(array,LEN);
return 0;
}
五 数组的运用,冒泡排序
1冒泡排序算法:
1. 1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
1.2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
1. 3.针对所有的元素重复以上的步骤,除了最后一个。
1.4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
2冒泡排序的函数代码:
首先是初始化, 函数里和函数外是"同一个数组"
然后函数封装运算遍历数组,排序
#include <stdio.h>
void initIntArray(int arr[], int length) {
for (int i = 0; i < length; i++) {
printf("请输入第 %d 个数字\n", i + 1);
scanf("%d", &arr[i]);
}
}
void foreachIntArray(int array[], int length) {
printf("====================\n");
for (int i = 0; i < length; i++) {
printf("%d\n", array[i]);
}
}
void bubbleSortByIntArray(int array[], int length) {
// int temp;
for (int i = 0; i < length - 1; i++) {
for (int j = 0; j < length - i - 1; j++) {
if(array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
}
int main(int argc, const char * argv[]) {
int nums[] = { 12, 3, 40, 25, 7 };
for (int i = 0; i < 4; i++) {
if(nums[i] > nums[i+1]) {
int t = nums[i];
nums[i] = nums[i+1];
nums[i+1] = t;
}
}
for (int i = 0; i < 4 - 1; i++) { // 5 - 1 - 1
if(nums[i] > nums[i+1]) {
int t = nums[i];
nums[i] = nums[i+1];
nums[i+1] = t;
}
}
foreachIntArray(nums, 5);
bubbleSortByIntArray(nums, 5);
foreachIntArray(nums, 5);
return 0;
}