思维导图:
目录
思维导图:
1.一维数组
1.1一维数组的创建:
1.2一维数组的初始化
1.3一维数组的使用
1.4一维数组在内存中的存储
2.二维数组
2.1二维数组的创建与初始化
2.3二维数组的使用
2.4二维数组的存储:
3.数组越界
4.数组作为函数参数
4.1两个例外:
5.两个应用实例
扫雷:
三子棋:
1.一维数组
1.1一维数组的创建:
一维数组是相同类型的一组数的集合。创建方法:
type_t arr_name [const n]
//type_t是数组类型
//arr_name是数组的名字
//const n 是常量
1.2一维数组的初始化
内涵:在创建数组时对数组内容进行合理赋值
初始化:
int arr[100]={0};//100个元素都是0
int arr[]={0};//数组大小不确定,其数组内放的元素都是零
char arr[100]={a,b,c,d};//如果是这样初始化则其它的元素是字符0
区分两种对字符数组的初始化:
#include<stdio.h>
int main() {
char arr[] = "abc";
printf("%s\n", arr);
char arr1[3] = { 'a','b','c' };
printf("%s", arr1);
}
结果:
为什么第二种结果呢?我们来调试看看:
通过对比,不难看出数组arr比arr1多了一个'\0'。也就是这个‘\0’使得打印结果不一样。 数组arr1中没有‘\0'所以打印完a,b,c时不会停止,直到遇到’\0'才能停止。所以它就打印了一些不可预测的值。
如果将arr[ ]改为arr[3]结果也会不可预测:
int main() {
char arr[3] = "abc";
printf("%s", arr);}
结果:
调试:
也是因为没有‘\0'.
1.3一维数组的使用
int main() {//[]是下标引用符号
int arr[] = { 0 };//一维数组可以不指定数组大小
//数组不完全初始化
int arr1[10] = { 0 };
//计算元素个数
int nums = sizeof(arr) / sizeof(arr[0]);
//用下标对数组进行访问,下标从零开始
for (int i = 0;i < nums;i++) {
printf("%d", arr[i]);//对数组元素依次进行打印。
}
return 0;
}
总结:
1.数组的访问从零开始
2.数组大小可以通过计算得出
1.4一维数组在内存中的存储
int main() {
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
return 0;
}
从数组内的元素存储情况可以看出数组内元素的地址都差了4个字节,4个字节也就是一个整型变量的大小,从这里可以认为数组的元素之间是并列排放的。
就像这样:
2.二维数组
2.1二维数组的创建与初始化
创建;
int main(){
int arr1[3][4];//整型数组
char arr2[3][4];//字符型数组
float arr3[3][4];//浮点型数组
return 0;
}
初始化:
int main() {
int arr1[3][4] = { 1,2,3,4 };
int arr2[3][4] = { {1,2},{3,4} };
int arr3[][4] = { 1,2,3,4 };//行可以省,列不能省
int arr4[][4] = { {1,2},{3,4} };
return 0;
}
2.3二维数组的使用
二维数组的使用也是通过下标的方式:
int main() {
int arr[3][4] = { 1,2,3,4,5,6 };
int i = 0;
int j = 0;
for (i = 0;i < 3;i++) {//双层循环的方式进行使用
for (j = 0;j < 4;j++) {
printf("%d ", arr[i][j]);
}
}
return 0;
}
2.4二维数组的存储:
先说结论:二维数组也是并列放的。
看看内存情况:
和一维数组一样,相邻元素之间的地址差4,所以二维数组的存放也是并列存储的。
3.数组越界
数组的下标是从零开始的,最后一个元素的下标是(n-1)。数组的大小是有限制的,所以数组的下标访问有可能越界。但是当数组越界时编译器是不报错的,因此我们在玩数组时要时刻检查数组的大小是否越界从而避免一些bug。如下面这个数组,越界但不报错:
4.数组作为函数参数
有时候,我们用一个函数来实现对一个数组进行排序时,我们就要将数组作为一个实际参数传进函数内。就像实现一个冒泡排序算法一样:
void bubble_sort(int arr[], int len) {
int i = 0;
int j = 0;
for (i = 0;i < len - 1;i++) {
for (j = 0;j < len - 1 - i;j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
}
int main() {
int arr[10] = { 2,6,7,9,4,55,66,33,44,88 };
int len = sizeof(arr) / sizeof(arr[0]);//计算数组的长度
bubble_sort(arr, len);//用一个冒泡排序函数实现从小到大排序
for (int i = 0;i < len;i++) {
printf("%d ", arr[i]);
}
return 0;
}
结果也是没有问题的:
但是函数里面的形参arr[]接收的是什么呢?是整一个元素还是数组的首元素地址呢?我们可以调试着看看,好吧,我不会调试,直接告诉你这里的形参接收的是数组的首元素地址。
在这里,如果将len放到函数里面去算,就会出问题。比如这样:
在这里可以看看len的大小:
在这里len的大小变成了1,也可以印证arr接收的是 数组的首元素地址。
4.1两个例外:
以下两种情况arr代表的是整个数组:
1.sizeof(arr)//sizeof()在操作符内。
2.为&arr这种形式时。
5.两个应用实例
扫雷:
http://t.csdn.cn/Tm7XN
三子棋:
http://t.csdn.cn/vKwRM