一、什么是数组?
数组是一组有序数据的集合,数组中各数据的排列是有一定规律的,下标代表数据在数组中的序号。
一维数组
一维数组的定义和初始化
定义:
<类型>数组名[<元素数量>]元素数量必须是大于零的整型常量表达式
int a[10];//表示定义了一个整型数组,数组名为a,数组名包含10个元素。
整型常量包括:字面常量,宏常量,常变量,枚举常量,运算结果为整型的表达式。
常量包括:字面常量,宏常量,常变量,枚举常量,字符常量,字符串常量。
注意:
- 数组的下标是从0开始,10个元素的下标是从0到9.
- 数组的组成:类型+大小,存储空间是连续的(数组看不见的属性),从 低地址到高地址,数组的类型是由元素的类型和数量所决定的。
- 数组未进行初始化时,默认元素为0,eg:给定数组int ar[]={};花括号中为空 时,数组中的元素被初始化为0;
初始化:
int main()
{
int ar[3]={1,2,3};
int ar[]={1,2,3};//给定数组成员,数组长度也就确定了;
int ar[3]={1,3};//可以,第三个元素默认为0;
int ar[n];//不可以,元素数量必须用常量或常量表达式;
}
int len=sizeof(ar)/sizeof(ar[0])表示计算数组ar中的数组长度
数组名和sizeof一起用时,表示整个数组的字节数,其余情况都表示数组首元素
一维数组的使用
#include <stdio.h>
int main()
{
int i=0;
int ar[5]={};
for{i=0;i<5;i++}
{
ar[i]=i; //给数组元素赋值
}
for(i=0;i<5;i++)
{
printf("%d",ar[i]); //打印数组需要用循环
}
return 0;
}
//还有一种常性数组const int ar[5]={1,2,3,4,5};表示数组元素只可读,不可写;
注意:
- 数组名作为首元素时,是一个指针常量,不能进行++ar或ar=ar+1,常量只能读值不能写值,在内存方面若移动整个数组会在内存中移动。
- 数组之间不能作为整体直接赋值(因为数组名是字符常量,赋值时左边必须为可变量)
- 数组在不同的地方有不同的叫法:在局部变量中定义叫数组,在函数中作为形参时为指针,作为形参时必须给行元素个数
- 数组指针里面存放的元素是地址
二维数组
二维数组的定义
定义:类型名 数组名[行表达式] [列表达式]
int main()
{
int ar[3][4];
char ar[2][3]; //这里是未进行初始化的数组
return 0;
}
二维数组的表示
物理表示:
逻辑表示:本质上,int ar[3][4],是由三个一维数组构成的,每个一维数组里面有四个元素
所以:int ar[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};在内存中如下图表示:
二维数组的初始化:
-
二维数组可以只对部分元素赋值,其他元素自动赋值为0
eg:int ar[3][4]={1,2,3,4,5,6};表示ar[0]={1,2,3,4}; ar[1]={5,6,0,0}; ar[2]={0,0,0,0}; -
二维数组的初始化,第一维长度可以省略,第二维不可省。
int ar[][4]={1,2,3,4,5,6,7,8,9,10,11,12}
//表示每个一维数组有四个元素,编译器会将元素个数按每组四个元素进行分配
int ar[][4]={1,2,3,4,5,6};
//表示ar[0]={1,2,3,4};ar[1]={5,6,0,0};
int ar[][4]={{1,2},{3,4},{5,6}};
//表示ar[0]={1,2,0,0};ar[1]={3,4,0,0}等等;
二维数组的使用:
int main()
{
int ar[3][4];
int x=0;
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
ar[i][j]=++x;
}
}
for (int i=0;i<3;++i)
{
for (int i=0;i<3;++i)
{
printf("&ar[%d][%d]=>0x%08x %d\n",i,j,&ar[i][j],ar[i][j]);
}
}
return 0;
}
运行结果为: