1.一维数组
在初学 c 语言的时候,不知道大家有没有这样的困惑,就是如果我要处理一系列的数据,比如说从1到100,那难道我要去设置100个变量,并把它们分别赋值吗?
出现其实就很好的解决了这个问题,通过设立一个相同数据类型的集合,然后赋予一个名称。每一个数据都有一个对应的下标,在调用的时候只需要输入名称和对你的数字就能够很好的调用数据。
那下面就让我们来看一下数组它是如何使用的吧
1.1一维数组的创建和初始化
int main()
{
int arr[5] = { 0,1,2,3,4 }; //一维数组的创建:数据类型 数组名称[数的个数];
// 一维数组的初始化: ={1,2,3,4,5}
char ch[5] = { "hello" };
return 0;
}

通过观察我们很容易发现数组的创建和初始化其实和变量十分相似,都是要先确定数据类型,再赋予他一个名称。也可以在创建的时候就给它赋值。
1.2一维数组的使用和注意事项
如果你是一个初学者,你也许会觉得数组的创建就一定要把数组里每一个元素全部初始化,其实不然,它和变量一样,你也可以通过后续的操作给它赋值,甚至是不赋值。
#include<stdio.h>
int main()
{
int num[10] = { 0 }; //不完全初始化
for (int i = 0; i < 10; i++)
{
scanf("%d", &num[i]); //通过for循环实现连续取值
}
for (int j = 0; j < 10; j++)
{
printf("%d ", num[j]); //通过for循环实现连续打印
}
return 0;
}

通过 for 循环连续取值和打印数组中的内容是从极为常见的操作。
如果你是一个刚刚开始学数组的人,那以下几个点你一定要注意。
1. 未被初始化的值会自动被初始化为0 数组的不完全初始化并不等于数组的这10个元素是没有值的,编译器会自动的把没有初始化的数字初始化为0。
2.数组的下标是从0开始的 意思就是说如果一个数组它有5个元素,那么他这5个元素的下标分别是0 1 2 3 4。
1.3一维数组在内存中的存储和使用技巧
那读到这里,你知道数组中的各个元素在内存中是如何储存?是以一个什么样的形式排列的吗?
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
for (int i = 0; i < 10; i++)
{
printf("arr[%d] = %p\n", i, &arr[i]);
}
return 0;

从这里我们可以很明显的看到数组中元素数在内存中的存储是连续的,由低到高的。
在这里也顺便解释一下,为什么它每一个数字相比较于前面的都加了4,因为整型它占了4个字节,所以在整形数组中。后一个元素比前一个元素在内存中的编号大4
1.32 使用技巧
在计算数组长度时有一个很方便的做法计算数组的长度
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
int len = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < len; i++)
{
scanf("%d", &arr[i]);
}
return 0;
}
通过计算整个数组所占的字节除以单个元素所占的字节,特别方便的算出数组的元素个数。
2二维数组
2.1二维数组的创建和初始化
对于二维数组,创建的方式无非就是在后面再加一个方框和数字。
int main()
{
int arr[3][5];
char ch[5][6];
return 0;
}
如果你是一个初学者,那这里有一种很好的理解方式,就是你把二维数组的排列理解成一个矩形。个矩形有一个个方格。像上面代码的 arr 数组,我们就可以把它理解成一个3行5列的表格。而表格中放着一个个的元素。

特别的,二维数组的初始化也有特殊的地方
#include<stdio.h>
int main()
{
int arr[3][5] = {1,2,3,4,5,6,7,8,9,10,11};
char ch[4][4] = { {"I"},{"Love"},{"C"} };
return 0;
}

在表格中我们可以很清楚的看到,当我们在大括号中继续套用大括号,我们就可以在上一行还没有完全初始化的情况下,把数据初始化到下一行。
3.冒泡排序的程序设计
现在已知一个数组,我想把他们升序排列,也就是冒泡排列。
#include<stdio.h>
void bubble_sort(int num[], int sz)
{
for (int i = 0; i < sz - 1; i++)
//确定需要交换多少次,一共10个元素,最多需要交换9次
{
for (int j = 0; j < sz - 1 - i; j++)
//第一个需要和9个数对比,对比后位置确定,此后的循环便不在需要与此元素对比,故-i
{
if (num[j] > num[j + 1])
{
int temp = num[j];
num[j] = num[j + 1];
num[j + 1] = temp;
}
}
}
}
int main()
{ //0 1 2 3 4 5 6 7 8 9
int num[] = {3,2,4,1,7,6,5,8,9,0 };
int sz = sizeof(num) / sizeof(num[0]);
bubble_sort(num, sz);
for (int i = 0; i < sz; i++)
{
printf("%d ", num[i]);
}
return 0;
}

这个代码的核心逻辑其实就是把每一个数和它旁边的作比较,如果说会更大就交换,那做9次比较之后。得出来的就一定是一个升序的数组。简单来说,这是一个有用但运行效率不算高的代码。
4.数组名指的是什么?(极易错点)
数组名是首元素的地址,这里通过一行很简单代码来证明
#include<stdio.h>
int main()
{
int arr[5] = { 0 };
printf("%p\n", &arr); //取整个数组的地址,即首元素的地址
printf("%p\n", &arr[0]); //取首元素的地址
printf("%p\n", arr); //arr代表的是首元素的地址,打印的仍然是首元素的地址
return 0;
}

但是需要注意,这种说法存在两个例外
1.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址
你可能会感觉很困惑,上面的代码,第一行和第二行产生的结果不是一样的吗?为什么说&arr就表示的是整个数组的地址,这就是因为数组的地址其实就是首元素的地址。因为数组元素的存放是连续的,我只需要记录第一个元素的地址,那之后的元素就在这个元素的地址之后。
2.sizeof(数组名),这里数组名代表的是整个数组,计算的是整个数组长度
#include<stdio.h>
int main()
{
int num[10];
int len = sizeof(num);
printf("%d",len); //len = 4 * 10 =40
return 0;
}
如果大家对我博客中有代码有什么不理解的,可以随时问我:>。

2736

被折叠的 条评论
为什么被折叠?



