一维数组
数组特点
由类型相同的元素组成的集合
空间连续
一维数组
格式
类型+数组名+[元素个数]
如
int a[10]
定义(初始化)
int a[4]={1,2,3,4};
也可以
int a[4]={1,2};//后面两个数初始化为0
因此当需要初始化一个很长的数组时
int a[100]={0};//所有数初始化为0
初始化指定元素
int a[4]={1,[4]=12};//
c99新规定的标准,不是所以编译器都支持,请自行测试
定义时候不加元素个数:
int a[]={1,2,3};
一定要初始化,最终数组的元素个数由初始化的数据个数决定
数组元素的访问
通过下标访问
int a[4]={1,2,3,4};//4代表元素个数
a[0]//0代表元素的下标
a[1]
a[2]
a[3]
一个是数组一个是下标运算,要分清楚
下标与元素个数的关系是:最大下标是元素个数-1
元素赋值
格式
a[0]=1;a[1]=2....a[10]=5;
or
scanf_s("%d",&a[0]);
注意点
可以是整型表达式
scanf_s("%d",&a[2+1]);
or
int a=5
scanf_s("%d",&a[a+1]);
数组名字是常量,不能赋值
int a[4]={1,2,3,4}只能在定义时候使用
一维数组地址
求数组大小
printf("%d\n",sizeof(a));//求出数组的字节数
取地址操作
int a[5]={1,2,3,4,5};
printf("%d\n",&a[0]);//取地址
printf("%d,%d”,&a[0]+1,&a[0]+2);//地址偏移
printf("%d,%d”,&a+1,&a+2);//地址偏移&a
地址偏移和地址偏移&a是不同的,第一个是数组里面的地址往前加一个元素的的字节
第二个是在数组的地址往前加一个数组的字节
二维数组
声明和初始化
概念
元素是一维数组的一维数组即为二维数组
声明
int a[x][y]={{});//a是数组名,x,y分别是1个一维数组
初始化
格式
int a[x][y]=({,},{,},{,});//a是数组名,x,y分别是1个一维数组
printf("%d",sizeof(a));
如
int main(void)
{
int a[3][2]={{1,2},//完整初始化
{3,4},
{5,6}};
printf("%d",sizeof(a));
system("pause");
return 0;
}
用行列式可以方便理解
初始部分元素
1、
int a[3][2]={{1,2},{3,4}};//未指定默认初始化为0
int a[3][2]={{1},{3,4}};//未指定默认初始化为0
2、
int a[3][2]={1,2,3,4,5};//按数据顺序往内存中存,最后一个元素默认为0
3、
int a[][2]={{1,2},{3,4}};//必须先初始化才能省略
二维数组地址
printf("%d,",&a[0][0]);//单个元素地址
printf("%d,",&a[0]);//一个一维数组的地址
printf("%d,",&a);//数组a的地址
数组之间的赋值
利用循环对对应元素赋值
int a[x]={};
int b;
for(i=0,i<5;i++)
{
a[i]=b[i];;
}
memcpy()
#include <memory.h>//要加头文件
memcpy(b,a,sizeof(数据类型)*字节数
)//将a复制到b
如
一维数组
#include<stdio.h>
#include<stdlib.h>
#include <memory.h>
int main(void)
{
int a[5]={1,2,3,4,5};
int b[5];
memcpy(b,a,sizeof(int)*5);
system("pasue");
return 0;
}
可以部分赋值
memcpy(&b[0],&a[2],sizeof(int)*3);//不能越界赋值,不能用数组名赋值
不能越界赋值,不能用数组名赋值
二维
int a[3][2]={1,2,3,4,5};
int [3][2];
memcpy(&b[0][0],&a[2][0],sizeof(int)*6);
多维数组
int a[2][3][4]={{{1,2,3,4},{1,2,3,4},{1,2,3,4}},{{1,2,3,4},{1,2,3,4},{1,2,3,4}}};
a[0][0][0];