「C 语言」4 数组
数组
一维数组的创建与初始化
数组的创建
数组是一组相同类型元素的集合,数组的创建方式
type_t arr_name [const_n];
//type_t 是指数组的元素类型
//const_n 是一个常量表达式,用来指定数组的大小
例子:
int arr[10];//放10个整型元素的数组
int n = 10;
int arr[n];//error - n应该是一个常量
float arr2[4];
double arr3[20];
数组的初始化
在创建数组的同时给数组内容一些合理的初始值(初始化)
int arr1[10] = {1,2,3};//不完全初始化 - 后面默认初始化为 0
int arr2[] = {1,2,3,4};
int arr3[5] = {1,2,3,4,5};//完全初始化
char arr4[3] = {'a',98,'c'};//可以有ascii码
char arr5[] = {'a','b','c'};
char arr6[10] = "abcdef";//abcdef\0
char arr7[] = "abc";//未指定大小必须初始化 有\0
printf("%d\n",sizeof(arr7);//7
printf("%d\n",strlen(arr7));//6
一维数组的使用
- 数组使用下标来进行访问,下标从0开始
- 数组的大小通过计算得到
int arr[10];
int sz = sizeof(arr)/sizeof(arr[0]);
数组的访问
#include<stdio.h>
int main()
{
char arr[] = "abcdef";
for (int i=0;i<(int)strlen(arr);i++)
printf("%c\n",arr[i]);
return 0;
}
一维数组在内存中的存储
#include<stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int sz = sizeof(arr)/sizeof(arr[0]);
fot (int i=0;i<sz;i++)
printf("&arr[%d] = %p\n",i,&arr[i]);
return 0;
}
数组在内存中是连续存放的
二维数组的创建与初始化
二维数组的创建
//数组创建
int arr[3][4];
char[3][5];
二维数组的初始化
//数组初始化
int arr[3][4] = {1,2,3,4};
int arr[4][4] = {{1,2,3},{4,5}};
int arr[][4] = {{2,3},{4,5}};//二维数组的列不能省略
二维数组的使用
行和列的标号都是从0开始的
int arr[3][4] = {{1,2,3},{4,5}};
for (int i=0;i<3;i++)
{
for (int j=0;j<4;j++)
printf("%d ",arr[i][j]);
printf("\n");
}
二维数组在内存中的存储
按行直接展开连续填充
数组作为函数参数
数组在传参时,传入的是数组首元素的地址
以冒泡排序为例
#include<stdio.h>
void bubble_sort(int arr[], int sz)
{
int flag = 1;//假设这一趟数据已经有序
//确定趟数
for (int i=0;i<sz-1;i++)
{
for (int 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;
flag = 0;//本趟排序不完全有序
}
}
if(flag==1)
break;
}
}
int main()
{
int arr[] = {9,8,7,6,5,4,3,2,1,0};
int sz = sizeof(arr)/sizeof(arr[0]);
//对arr进行排序
bubble_sort(arr,sz);
for (int i=0;i<sz;i++)
printf("%d ",arr[i]);
return 0;
}
数组名是什么?
#include<stdio.h>
int main()
{
int arr[] = {1,2,3,4,5};
printf("%p\n",arr);
printf("%p\n",&arr[0]);
//二者等价
printf("%d\n",*arr);//1
return 0;
}
数组名是数组首元素的地址(有两个例外)
#include<stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6};
int sz = sizeof(arr)/sizeof(arr[0]);
//sizeof(arr_name) - 计算的是整个数组的大小
printf("%p\n",&arr);//数组的地址 - 和&arr[0]不同
printf("%p\n",&arr+1);//这和&arr[0]+1不同
//&arr_name - 取出的时整个数组的地址
return 0;
}
数组的地址和数组首元素的地址意义不同
&arr 和 &arr[0] 表现一样 &arr+1 和 &arr[0]+1 表现不一样