//--------------------数组的初始化
类型说明符
数组名[常量表达式] = { 值, 值......值 };
其中在{ }中的各数据值即为各元素的初值,各值之间用逗号间隔。
//--------------数组初始化的注意事项
1)指定元素的个数的同时,对所有的元素进行显式的初始化
int nums[5] = {1,2,3,4,5};
2)指定数组的元素个数,对数组进行部分显式初始化 定义的同时对数组进行初始化,没有显式初始化的元素,
那么系统会自动将其初始化为0
int num[5] = {1} ---> 1,0,0,0,0
3)不指定元素个数,定义的同时初始化,它是根据大括号中的元素的个数来确定数组的元素 个数
int nums[] = {1,2,3,5,6};
4)指定元素个数,同时给指定元素进行初始化
int nums[5] = {[4] = 3,[1] = 2};
给数组赋值的方法除了用赋值语句对数组元素逐个赋值外
还可采用初始化赋值和动态赋值的方法
使用变量定义的数组不可以定义数组的同时对数组进行初始化
int a = 6;
int nums[a];
先定义后初始化
数组没有初始化,数组里面是垃圾数
数组如果部分初始化,剩下的会自动初始化为0,所以是0
先定义后初始化,后初始化的只会对部分元素初始化,其余依旧是垃圾数
int a[10];
a[1] = 10;
a[5]? //垃圾数
//------------------------------数组的引用
数组名[下标]
数组元素通常也称为下标变量。必须先定义数组,才能使用下标变量。
int a[3] = {1,2,3};
a[0] = 1;
a[1] = 2;
a[2] = 3;
a[3]?
正序输出
for (int i=0; i<10; i++) {
printf("%d\t",a[i]); }
逆序输出
for (int j=9; j>=0; j--) {
printf("%d\t",a[j]); }
数组的遍历 ---> 初始化
for (int i=0;i<len; i++) {
printf("请输入数组的第%d个值\n",i+1);
scanf("%d",&a[i]);
}
数组长度
定义数组
遍历
//----------------------------一维数组的存储方式
存储方式:
1)计算机会给数组分配一块连续的存储空间
2)数组名代表数组的首地址
从首地址位置,依次存入数组的第1个、第2个....、第n个元素
3)每个元素占用相同的字节数(取决于数组类型)
4)并且数组中元素之间的地址是连续。
一维数组的地址
在内存中,内存从大到小进行寻址,为数组分配了存储空间后,数组的元素自然的从上往下排列 存储,整个数组的地址为首元素的地址。
2)数组名存放的是数组的首地址
数组的首地址:数组的第一个元素首地址(第一个元素的第一个字节地址)
//-----------------------------计算数组长度
:sizeof(数组名)
数组的长度 = 数组占用的总字节数 / 数组元素占用的字节数
//-----------------------------数组的越界问题
总结:
一个长度为n的数组,最大下标为n-1, 下标范围:0~n-1
1、约错了对象(访问自己不该访问存储空间)
2、程序崩溃
//-------------------------找最大值
定义变量
遍历存入数组
假设max = a[0]
比较
if(a[i]>max) max=a[i];
//-------------------------数组元素作为函数参数
数组用作函数参数有两种形式:
一种是把数组元素(下标变量)作为实参使用;
一种是把数组名作为函数的形参和实参
数组元素作函数实参,就是把数组元素的值传送给形参
数组名作为函数参数,就是把数组的地址传递过去
1)用数组名作函数参数时,则要求形参和相对应的实参都必须是类型相同的数组
2)在C语言中,数组名除作为变量的标识符之外,数组名还代表了该数组在内存中的起始地址, 因此,当数组名作函数参数时,实参与形参之间不是"值传递",而是"地址传递",实参数组名将 该数组的起始地址传递给形参数组,两个数组共享一段内存单元,编译系统不再为形参数组分配存储单元。
3) 在变量作函数参数时,所进行的值传送是单向的。即只能从实参传向形参,不能从形参传回实 参。形参的初值和实参相同,而形参的值发生改变后,实参并不变化,两者的终值是不同的。
注意点
1形参数组和实参数组的类型必须一致,否则将引起错误。
2形参数组和实参数组的长度可以不相同
3在函数形参表中,允许不给出形参数组的长度,或用一个变量来表示数组元素的个数。
4多维数组也可以作为函数的参数。
在函数定义时对形参数组可以指定每一维的长度,也可省去 第一维的长度。
sizeof(地址) --> 地址都是占8个字节
//------------------冒泡排序
大数下沉,小数上浮
1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。
在这一点,最后的元素应该会是最大的数。
3)针对所有的元素重复以上的步骤,除了最后一个。
4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
ß
for (int i=0; i<len-1; i++){
//每趟排序都会确定一个数,所以需要再循环len-i次,但因为每次都是
//相邻的两个数进行比较,为了a[j+1]不越界,让j循环到len-i-1时停止。
for (int j=0; j<len-i-1; j++) {
if(a[j]>a[j+1]){
int temp = 0;
temp = a[j];
a[j]=a[j+1];
a[j+1]= temp;
}
}
} |
|