数组:存放一组数据
两种初始化:静态初始化与动态初始化
静态初始化:指定个数,但没有全部初始化,则剩下的自动为0 如:a[4]={};
制定个数,并全部初始化
制定个数,但没有初始化,则全部为0,但注意 是有了“ { }”,表明是静态初始化
指定个数,并指定下表初始化,则没有初始化部分为0
动态初始化:指定个数,挨个赋值
指定个数,初始化一部分,则剩余的值不确定
越界后的结果难以预料
%p 用于十六进制输出,而地址的输出就是十六进制输出,输出时0x代表后面的数字是十六进制数字
数组中的元素的地址是连续的
数组名的地址=首元素的地址=数组的地址=数组名
计算数组的元素数量:数组的总字节数 / 单个元素类型的字节数 = 数组的长度
如: a[5]={}; sizeof(a)/ sizeof(int) 其中a代表数组的首地址,所以sizeof会自动算出这个数组的总长度
但是,若将a作为指针传送则不行,因为它是将a当成一个指针传送过去,所以sizeof(a)算出来的值是作为指针的a的长度
数组的元素可以作为函数的参数:元素是变量,数组名与首地址是常量,但元素有个确切的值
数组的元素作为函数的参数与普通的变量作为函数的参数是一样的,因为虽是变量但有一个确切的值
数组名是一个常量,它的值是数组的首地址,其值不可改变,但里面的内容可以改变
void a(int a[],int length); 其中int a[]是数组的形参,length是int型的形参,学完指针后,会已int * a来代替数组的形参,而且接受的时候,其实也是已指针形式接收
传递的如果是个地址,则函数内会修改的是地址内的值,而如果传递的是一个值,则修改的是复制过来的值,而不是地址内的值,所以结果或许会有些与预想的偏差 这就是值传递与地址传递
值传递与地址传递的区分:看传递的是变量本身还是地址,
仅用两个变量彼此值交换
A=A+B;
B=A-B;
A=A-B;
冒泡排序:因为要分轮,且每轮比较次数不同,所以用双层for循环计算,第一个for代表比较轮数 第二个for代表每一轮比较次数,与每次哪两个值比较
简解:
轮数为len-1次,如a[6],五轮确认五个数,则剩下一个数就自然确定了
次数为len-1-i,其中i代表轮数,因为i值通常取0,但第一轮的比较次数就为len-1次,所以为len-1-i
详解:
用Len代表数组长度,则比较轮数为len-1,因为六个数比较五轮,每轮确认一个数,则五轮确认五个数,在前后两数比较中,后面的数都比前面大,则最前面的最后一个数自然就确定了
若轮数i的初始值为0,则比较次数为Len-1-i次,因为每过一轮,确认一个数,所以经过i轮确认i个数,第一轮比较次数为len-1 再第二轮比较次数为len-2,但用来表示轮数的i值通常取初值为0,所以比较的次数为len-1-i,减1是当i为0时,也要比较Len-1次,每一轮,比较次数减一,即为len-1-i,i为递增数
ps:从a[0]与a[1]比较到a[len-1]与a[len],因为下表要从开始用j来表示,即为a[j]与a[j+1],所以比较到len-1次时,为a[len-1]与a[len],
轮跟长度有关,次数跟轮有关,下标跟次数有关
二维数组 a[m][n],m个一维数组,每个数组有n个元素,总共有m*n个元素。
二维数组的静态赋值:
连续赋值遵循一维数组的静态赋值 int a[2][2]={0,1};剩余部分为0
分段赋值,a[2][4] = {{1,2},{1,2}};缺少部分补0
动态赋值:依旧是一个一个赋值
在静态初始化中,行可以不写,列必须写,因为列可以算出
在动态初始化中,啥都不能省略
双重for循环输出二维数组的值
在Xcode中,可以用变量来指定数组的长度,其它平台不行