数组
一、一维数组的创建和初始化
数组是一组相同类型元素的集合
一维数组的基本形式:元素类型 数组名[元素个数]={...}
例:
int arr[3]={1,2,3};
*1. *在{}内输入一组相同类型的元素就是对数组进行初始化
*2. *[ ]内的元素个数可以省略,数组的大小会根据初始化的内容来确定
例:
char arr1[4]="abc";
char arr2[4]={'a','b','c','d'};
*1. *注意区别两者,arr1是字符串,该写法会自动补充'\0',arr2是字符数组,若初始化的内容未达到所填写的元素个数,才会填充空字符直至满足数组长度
*2. *字符串以'\0'结尾,字符数组是用来存储字符的数组,不一定包含'\0'
*3. *字符串一定是字符数组,字符数组不一定是字符串
*4. *字符串指定的长度必须 ≥ 表面上的初始化内容+自动填充的'\0',否则会导致编译错误
二、一维数组的使用
数组元素的访问和使用通过下标引用操作符[]实现
例:打印数组的元素
#include <stdio.h>
int main()
{
int arr[3]={1,2,3};
int i=0;//下标从零开始
for (i=0;i<3;i++)
{
printf("%d ",arr[i]);
}
return 0;
}
三、一维数组在内存中的存储
例:
#include <stdio.h>
int main()
{
int arr[3]={1,2,3};
int i=0;
for(i=0;i<3;i++)
{
printf("&arr[%d]=%p\n",i,&arr[i]);
}
return 0;
}
输出的结果为:
每个元素的地址相差四个字节
因此,一维数组在内存中是连续存放的
四、二维数组的创建和初始化
创建的基本形式:
元素类型 数组名[行数] [列数]
如:
int arr[3] [4]
char ch[2] [3]
double arr2[3] [5]
初始化:
int arr[2] [3]={1,2,3,4,5,6};
int arr[2] [3]={{1,2},{3,4}};
二维数组的初始化行可以省略,列不可省略,因为元素会根据列数排满一行自动排下一行
五、二维数组的使用
同一维数组一样,二维数组元素的访问和使用也是通过下标引用操作符实现的,行和列的下标都是从0开始
六、二维数组在内存中的存储
二维数组可以看作是一维数组的数组,以行为单位在内存中连续存放
#include <stdio.h>
int main()
{
int arr[3] [4];
int i=0;
int j=0;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("&arr[%d][%d]=%p\n",i,j,&arr[i][j]);
}
}
return 0;
}
输出结果为:
七、数组越界
若有n个元素,首元素的下标为0,最后一个元素的下标为n-1,若访问元素时下标不在0~n-1的范围内,这种情况就叫做数组越界,我们并不知道访问的内容是什么,编译器也不一定会报错,因此编写代码时需要注意越界的检查
八、数组作为函数的参数
数组名本质上是首元素的地址,我们将数组作为参数传递给函数时,传递的是首元素的地址
例:将一个整型数组按升序排序
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void bubble_sort(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz - 1; i++)
//每轮外循环后出现一个冒泡数,即最大值
//当除最后一个元素之外的冒泡数都出现后,最后一个元素也排好了,因此进行sz-1次外循环
{
int j = 0;
for (j = 0; j < sz - 1 - i; j++)//sz-1-i表示每轮外循环中冒泡数无需再进行比较+排序
{
if (arr[j] > arr[j + 1])//每轮外循环中相邻两元素进行比较
//大的元素往后冒泡
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
int main()
{
int arr[] = { 6,4,2,8,0,9,1 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
bubble_sort(arr, sz);
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
整体逻辑:
1. bubble_sort函数中,外循环→找出冒泡数,内循环→寻找冒泡数的具体操作
2. main函数中,创建数组并打印排序后的数组元素
若sz放入bubble_sort函数计算,而不是主函数计算,即:
void bubble_sort(int arr[], int sz)
{
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;
• }
• }
• }
}
则sz的计算结果为1,因为arr作为首元素的地址传递给函数,int arr[]是一个指针变量:int* arr,所占内存大小与一个元素所占内存相同
在main函数内部用sizeof(数组名),计算的是整个数组所占内存空间