//------------------数组的基本概念及分类
把具有
相同类型
的若干变量
按
有序
的形式组织起来。这些按序排列的
同类数据元素
的集合称为
数组
在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。
//----------------------一维数组
如果一个数组的所有元素都不是数组,那么该数组称为一维数组
//-----------------------定义
类型说明符 数组名[常量表达式];
注意点
1) 数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相
同的。第一个数组元素的地址是数组所占内存块的首地址
2) 数组名的书写规则应符合标识符的书写规定。 命名规则:
/*
1、只能由字母、数字、下划线组成
2、不能数字开头
3、不能与关键字重名
4、严格区分大小写
命名规范:
1、起一个有意义名字
2、驼峰标示
*/
3) 数组名不能与其它变量名相同。
4) 方括号中常量表达式表示数组元素的个数,如a[5]表示数组a有5个元素。但是其下标从0开始计算。
5) 不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。
c99不支持使用变量作为元素个数
//----------------------初始化
直接初始化:
类型说明符 数组名[常量表达式] = { 值, 值......值 };
先定义后初始化:
类型说明符 数组名[常量表达式];
数组名[0] = 9;
数组名[1] = 10;
.....
其中在{ }中的各数据值即为各元素的初值,各值之间用逗号间隔。
问题:
int arr[10];
scanf
如何遍历初始化数组?
如何遍历输出这个数组元素?
如何通过for循环遍历初始化
//--------------------数组的引用 数组名[下标]
数组元素通常也称为下标变量。必须先定义数组,才能使用下标变量。
正序输出
for (int i=0; i<10; i++) {
printf("%d\t",a); }
逆序输出
for (int j=9; j>=0; j--) {
printf("%d\t",a[j]); }
越界总结:
一个长度为n的数组,最大下标为n-1, 下标范围:0~n-1
1、如果越界了就相当于(访问自己不该访问存储空间)
//-------------------数组定义,初始化,引用注意
1)
int count = 5;
int arr[count] = {1,2,3,4,5}; //错误的
int arr[count]; //正确的
arr[0] = 1;
arr[1] = 1;
...
结论:使用变量作为数组长度表示,只能定义数组,不能立马对数组进行初始化
2)
int arr[]; //错误的
int arr[5]; //正确 数组长度为5
int arr[] = {1,2,3,4,5}; //正确 数组长度为5
结论:定义数组一定会确定数组长度
3)
int arr[3];
arr[3] = 5; //错误 越界 数组下标使用从0开始
以下正确
arr[0] = 5;
arr[1] = 2;
arr[2] = 3;
结论:数组下标从0开始算,最大下标为(数组元素个数-1)
4)
1.完全初始化
int nums[5] = {1,2,3,4,5};
2.局部初始化
int arr[100] = {1,2}; //系统会自动将其初始化为0
arr[0] = 1
arr[1] = 2
arr[2] = 0
arr[3] = 0
3.个别初始化
// int nums[5] = {[4] = 3,[1] = 2};
// num[0] =
// num[1] =
// num[4] =
int num[5];
num[0] = 4;
num[3] = 5;
num[0] = 4
num[1] = 0 100 998 19 ---> 垃圾数
num[4] = 垃圾数
//--------------------一维数组的存储方式
存储方式:
1)计算机会给数组分配一块连续的存储空间
2)数组名代表数组的首地址
从首地址位置,依次存入数组的第1个、第2个....、第n个元素
3)每个元素占用相同的字节数(取决于数组类型)
4)并且数组中元素之间的地址是连续。
一维数组的地址
在内存中,内存从大到小进行寻址,为数组分配了存储空间后,数组的元素自然的从上往下排列 存储,整个数组的地址为首元素的地址。
2)数组名存放的是数组的首地址
数组的首地址:数组的第一个元素首地址(第一个元素的第一个字节地址)
//-----------------------数组作为函数参数
数组用作函数参数有两种形式:
一种是把数组元素(下标变量)作为实参使用;
一种是把数组名作为函数的形参和实参
数组元素 作函数实参,就是把 数组元素的值 传送给形参 //值传递
数组名 作为函数参数 是把数组的地址 传递给形参数 //地址传递
注意:用数组名作函数参数时,则要求形参和相对应的实参都必须是类型相同的数组
注意点
1形参数组和实参数组的类型必须一致,否则将引起错误。
2形参数组和实参数组的长度可以不相同 (但是容易出现问题)
3在函数形参表中,允许不给出形参数组的长度,或用一个变量来表示数组元素的个数。
//----------------------------数组长度
数组长度 = sizeof(数组名) / sizeof(类型)
数组的长度 = 数组占用的总字节数 / 数组元素占用的字节数
结论: 你要计算这个数组的长度,你必须在作为参数传递之前计算这个数组的长度 长度作为参数传过去用
int a = 999;
sizeof(&a) ---> 8
|
|