C语⾔⼀维数组、⼆维数组的创初始化、使⽤和存储
⽬录
数组
数组(Array)是在内存中连续存储的具有相同类型的⼀组数据的集合。
数组是⼀组相同类型元素的集合。这些元素在内存中依次连续挨着存放。
数组中,若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。⽤于区分数组的各个元素的数字编号称为下标。
注意:
1,数组的下标从0开始(包括0)连续计算。
2,数组中的各元素的存储是有先后顺序的,它们在内存中按照这个先后顺序连续存放在⼀起。
3,数组元素⽤整个数组的名字和它⾃⼰在数组中的顺序位置来表⽰。例如,a[0]表⽰名字为a的数组中的第⼀个元素,a[1]代表数组a的第⼆个元素,以此类推。
4,数组中的所有元素都具有相同类型。数组中的元素存储在⼀个连续性的内存块中,并通过索引来访问。最低的地址对应第⼀个元素,最⾼的地址对应最后⼀个元素。
5,数组元素并⾮只能是基本数据类型,还可以是结构、枚举或类。
⼀维数组
⼀维数组的创建和初始化
⼀维数组是最简单的数组,其逻辑结构是线性表。要使⽤⼀维数组,需经过定义、初始化和应⽤等过程。
⼀维数组的定义
在 C 中要声明⼀个数组,需要指定元素的类型和元素的数量,⼀维数组定义的语法规则为:
类型说明符 数组名[常量表达式];
例如:
char arr1[3];//数组类型为char,数组名为arr1,数组中⼀共有3个元素。
int arr2[5];
double arr3[8];
int arr4[3+7];
在上⾯的例⼦中,定义了⼀个数组名为arr1的char类型数组,该数组中可以容纳3个char类型的元素。
注意:数组的创建定义中,[ ]内要给⼀个常量(或者常量表达式)才可以,不能使⽤变量。
⼀维数组的初始化
数组的初始化是指,在创建数组的同时给数组的内容⼀些合理的初始值(初始化)。
完全初始化
定义数组时给所有元素赋初值,这叫“完全初始化”。
char arr1[3]={'a','d','f'};
int arr2[5]={1,2,3,4,5};
double arr3[2+3]={1.0,2.0,3.0,4.0,5.0};
char arr4[5]="abcde";
注意:数组{ }中元素的个数不能⼤于数组声明时[ ]中常量的个数。如果定义的数组的长度⽐花括号中所提供的初值的个数少,也是语法错误,如int arr[2] = {1,2,3,4};,这样写是错误的。
如果定义数组时就给数组中所有元素赋初值,那么就可以不指定数组的长度,因为此时元素的个数已经确定了。编程时我们经常都会使⽤这种写法,因为⽅便,既不会出问题,也不⽤⾃⼰计算有⼏个元素,系统会⾃动分配空间。例如:
int arr1[]={1,2,3,4,5};//相当于int arr1[5] = {1,2,3,4,5};
char arr2[]="asdf";
这种写法和上⾯的写法⼀样,只不过数组[ ]中的元素个数等于后⾯{ }的元素个数,编程时⾃动给数组分配内存。
注意:省略[ ]中数字的写法只适⽤于在定义数组时就初始化时。如果定义数组时不初始化,那么省略数组长度就是语法错误。例如:int
arr[];这种写法是错误的。编译器会提⽰你没有指定数组的长度。
不完全初始化
可以只给⼀部分元素赋值,这叫“不完全初始化”。
如果在定义和初始化数组时,[ ]中的数字⼤于数组{ }中的元素个数,则后⾯还没初始化的元素值默认全为0。⽐如:
int arr1[5]={1,2,3};//只初始化了3个元素
int arr2[5]={0};
上⾯的代码中arr1中的全部元素为:1,2,3,0,0;arr2中全部元素为:0,0,0,0,0。
定义的数组 a 有 5 个元素,但花括号内只提供两个初值,这表⽰只给前⾯两个元素 a[0]、a[1] 、a[2]初始化,⽽后⾯三个元素都没有被初始化。不完全初始化时,没有被初始化的元素⾃动为 0。
注意:“不完全初始化”和“完全不初始化”不⼀样。如果“完全不初始化”,即只定义“int a[5];”⽽不初始化,那么各个元素的值就不是0了,所有元素都是随机值,也称为:垃圾值。
不可以写成int a[5]={};。这是完全不初始化,如果⼤括号中什么都不写,那就是极其严重的语法错误。
⼤括号中最少要写⼀个数。⽐如int a[5]={0};,这是不完全初始化,这时就是给数组“清零”,此时数组中每个元素都是零。
⼀维数组的使⽤
我之前详细写了操作符的有关内容,感兴趣的朋友可以看这:。
对于数组的使⽤需要借助⼀个操作符:[ ],下标引⽤操作符。它其实就是数组访问的操作符。
数组必须先定义,然后使⽤。C 语⾔规定,只能逐个引⽤数组元素,⽽不能⼀次引⽤整个数组。数组的元素只能⼀个⼀个的输出。数组元素的表⽰形式为:
数组名[下标]
注意:定义数组时⽤到的 “数组名[常量表达式]” 和引⽤数组元素时⽤到的 “数组名[下标]” 是有区别的,定义数组时的常量表达式表⽰的是数组的长度,⽽引⽤数组元素时的下标表⽰的是元素的编号。
例如:
int num =0;
int arr[5]={1,2};//定义长度为5的数组arr
num = arr[0];//引⽤数组arr中下标为0的元素a[0]赋值给num
⼀维数组的使⽤中,很多时候都需要借助for循环。
⼀维数组的使⽤代码⽰例
#include<stdio.h>
int main()
{
int arr[10]={0};//数组的不完全初始化
//⽤sizeof操作符计算数组元素的个数
int sz =sizeof(arr)/sizeof(arr[0]);
//对数组的内容复赋值,数组是使⽤下标来访问的,下标从0开始。
int i =0;//index做下标
for(i =0; i <10; i++)
{
//将数组的10个元素全部赋值为0~9
arr[i]= i;
}
//输出打印数组的全部内容
for(i =0; i <10; i++)
{
printf("%3d",arr[i]);
}
printf("\n");
printf("数组中元素的个数为:%d\n",sz);
return0;
}
输出结果为:
0123456789
数组中元素的个数为:10
请按任意键继续...
注意:
1,数组是使⽤下标来访问的,数组的下标是从0开始的。
2,数组的使⽤要⼩⼼⽉结访问,⽐如:int arr[5];那么我们只能访问 arr[0]~arr[4] 之间的5个元素,其它元素都是⾮法的,如,arr[5]是⾮法的。
3,数组的⼤⼩可以通过单⽬操作符 sizeof 计算得到。
⼀维数组在内存中的存储
代码⽰例
#include<stdio.h>
int main()
{
int arr[8]={0};
int i =0;
for(i =0; i <sizeof(arr)/sizeof(arr[0]); i++)
{
printf("&arr[%d] = %p\n",i,&arr[i]);
}
return0;
}
输出结果:
&arr[0]=005EFC2C
&arr[1]=005EFC30
&arr[2]=005EFC34
&arr[3]=005EFC38
&arr[4]=005EFC3C
&arr[5]=005EFC40
&arr[6]=005EFC44
&arr[7]=005EFC48
请按任意键继续...
观察输出结果,从中可以看出,随着数组下标的增长,元素的地址也在有规律的递增。
结论,数组在内存中是连续存放的。
⼆维数组
⼆维数组与⼀维数组相似,但是⽤法上要⽐⼀维数组复杂⼀点。后⾯的编程中,⼆维数组⽤得很少,因为⼆维数组的本质就是⼀维数组,只不过形式上是⼆维的。能⽤⼆维数组解决的问题⽤⼀维数组也能解决。
⼆维数组的创建和初始化
⼆维数组通常可以⽤来表⽰数学上的⾏列矩阵。即⽤⼆维数组的第⼀维表⽰⾏,第⼆维表⽰列;⽣活中凡是能抽象为对象及对象的若⼲同类型属性的问题,⼀般⽤⼆维数组来描述。
⼆维数组的定义
⼆维数组的语法规则为:
类型说明符 数组名[第⼀维⼤⼩][第⼆维⼤⼩];
其中,第⼀、⼆维的⼤⼩⼀般均为常量表达式。
c语言二维数组表示方法⼆维数组中的元素个数 等于 第⼀维⼤⼩ 乘 第⼆维⼤⼩。
⽰例:
char arr1[3][4];//表⽰3⾏4列的char类型数组arr1
int arr2[5][6];
double arr3[8][4];
int arr4[3+7][2+4];
第⼀维⼤⼩ 表⽰第⼀维下标的长度,第⼀维⼤⼩ 表⽰第⼆维下标的长度。
从矩阵⽅⾯来理解的话,第⼀维⼤⼩ 表⽰ ⾏ 下标的长度,第⼀维⼤⼩ 表⽰ 列 下标的长度。
注意:下⾯这些定义形式都是错误的:
int arr5[][3];//错误。编译器⽆法确定所需空间
int arr6[2][];//错误。缺少列下标,编译器⽆法确定所需空间
⼆维数组的初始化
int arr1[2][3]={1,2,3,4,5,6};
int arr2[3][4]={{1,2},{3,4}};
int arr3[][5]={{1,2,3},{4,5}};//表⽰这是⼀个2⾏5列的int型数组arr3
char arr4[][5]={"abct","dgf"};
1, 分⾏给⼆维数组赋初值
int arr[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};//3⾏4列
2,将所有数据写在⼀个花括号内,按数组排列的顺序对各元素赋初值
int arr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};//表⽰3⾏4列的12个元素
3,只对部分元素赋初值
int arr[3][4]={{1,2,3},{5},{9}};//不完全初始化,表⽰3⾏4列
它的作⽤是对第⼀⾏的前两个元素赋值、第⼆⾏和第三⾏的第⼀个元素赋值。其余元素⾃动为 0。这个⼆维数组初始化后数组各元素为:
1 2 3 0
5 0 0 0
9 0 0 0
4, 如果在定义数组时就对全部元素赋初值,即完全初始化,则第⼀维的长度可以不指定,但第⼆维的长度不能省。
int arr[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
等价于:
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
系统会根据数据总数和第⼆维的长度算出第⼀维的长度。但这种省略的写法⼏乎不⽤,因为可读性差。
但是如果 只指定第⼀维的长度,不指定第⼆维的长度, 这样会发⽣错误,⼆维数组不允许这样的初始化⽅式。
5,⼆维数组“清零”,⾥⾯每⼀个元素都是零
int a[3][4]={0};
⼆维数组的使⽤
⼆维数组的使⽤也是通过下标的⽅式。⼀维数组的使⽤中,“数组的元素只能⼀个⼀个输出”,⼆维数组也不例外。在⼀维数组中是⽤⼀个for 循环进⾏输出,⽽⼆维数组元素的输出要使⽤两个 for 循环嵌套。
代码⽰例
#include<stdio.h>
int main()
{
int arr[3][4]={{1,2,3},4,5,6,7,8,9,10,11};
int i =0;//i为⾏循环变量,⽤来控制⾏
int j =0;//j为列循环变量,⽤来控制列
for(i =0; i <3; i ++)
{
for(j =0; j <4; j ++)
{
printf(" %2d",arr[i][j]);
}
printf("\n");//每⼀⾏结束时,⽤来换⾏
}
return0;
}
输出结果:
1230
4567
891011
请按任意键继续...
⼆维数组的打印输出中,有两个for循环,第⼀个for循环⽤来控制⾏,第⼆个for循环⽤来控制列。
⼆维数组在内存中的存储
⼆维数组在内存中是连续存储的,⼆维数组的底层是按⼀维数组存的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论