数组: 内存中连续存储多个元素的结构
声明一个数组时,编译器为数组分配内存存储空间,数组占据的内存空间是连续的,我们可以计算数组占据的内存大小和
每个元素对应的内存受地址。使用数组处理大量同类型数据
对一个大小为N,类型为short的数组,其占据的内存大小为:
N*sizeof(short)=N*2
如果说第一个元素在内存中的地址为P,那么第M个元素在内存的地址可表示为:P+(M-1)*sizeof(short)
#include<stdio.h>
#include<stdlib.h>
void main()
{
int a[10];数组越界不报错
//因为数组外部的内存空间,不确定是否有权限
//如果越界访问,程序会崩溃
for(int i=0;i<10;i++)
{
a[i]=i+1;
}
}
int main1()
{
int a[5]={1,2,3,4,5};//int指定每个元素的大小
//数组在内存中是连续排列
// printf("%x,a");
printf("%d",sizeof(a));//求内存占多少
printf("\n%d",sizeof(a)/sizeof(int));//求数组多少元素
printf("\n%x,a");
for(int i=0;i<5;i++)
{
printf("\na[%d]=%d &a[%d]=%x",i,a[i],&a[i]);//数组中每个元素的大小
}
system("pause");
}
数组类型:一维数组,二维数组、三维数组
一维数组也称向量, 用以组织具有一维顺序关系的一组同类型数据,在使用数组前,必须先声明数组,编译器根据声明语句为其分配内存,这样数组才有意义。
要在内存中开辟一块连续内存给数组用,需要考虑以下问题,一是在哪里开辟,二是开辟多大的地方,C语言中,这都是由编译器自动完成的,编程人员需要定义数组,即所开辟的数组应能盛放多少元素,每个元素是什么类型,另外,编程人员还要指定数组名。
一维数组声明的基本格式为:
类型 数组名【数组元素个数】
比如 double sz[6];告诉编译器3条信息,数组名是sz,存放的元素是double型,数组存放的元素个数为6,这样,便可以对数组及数组元素进行读写访问。
注意:必须防止下表越界的错误发生,对上面声明的数组sz来说,有效的下标是0到5,在程序中如果出现了sz[6],编程器有时并不会报错,但这可能引起程序电费崩溃。
存在潜在的安全隐患:没有对数组元素初始化,因为立即采用键盘输入为数组元素赋了值,好像问题不大,但如果需要对代码修改,不小心在赋值前便使用了数组元素,这时初始化内存单元内容的不确定,程序输出的结果往往是不可预料的。
不仅仅是数组,在声明创建一个变量后马上对其初始化是个良好的习惯,能有效减少各种意想不到的错误。
#include<stdio.h>
#include<stdlib.h>
#define N 20
int main()
{
int a[N]; //只有define可以
// printf("%d",&N); //编译器放在常量区,没有地址,无从修改
//
const int num = 10;//可变的常量 ,可以强制去掉常量的属性
//num = 12; const限定代码不能修改,在内存有实体,是可变的数
printf("%x",&num);
//int b[num];//这样不可以
system("pause");
}
数组初始化
一维数组的初始化形式一般为:类型 数组名[宽度]=[初值列表];如:int a[10]=[10,9,8,7,6,5,4,3,2,1];
括号中可以省略数组宽度。此时编译器通过给出的数据个数来定义数组的宽度;
如:int a[]={10,9,8,7,6,5,4,3,2,1};等价于int a[10] ={10,9,8,7,6,5,4,3,2,1}
int b[]={1,2,3,4};
int b[10]={1,2,3,4}
上面两者并不等价,第一个内存为16个字节,第二个为40个字节,后面的元素初始化为0.
double num[]={};//无法指定数组的大小,无法分配内存
double num[10]={0};//num的数值全部为0