1一维数组
1.1一维数组的创建和初始化
1.2一维数组的创建:
我们在函数中无法存放多个变量所以我们来用数组存放多个变量
一维数组的创建:元素类型 数组名 常量表达式
int arr [10]
数组的下标都是重零开始计算的
1.3一维数组的初始化:
数组的初始化分为,完全初始化和不完全初始化
完全初始化: int arr[5]={1,2,3,4,5};
不完全初始化:int arr[5]={1,2,3;
如上图所示我们从监视窗口来看未完全初始化一维数组会自动像后补零
一维数组初始化也可以不给常量表达式:int arr[]={1,2,3,4,5};
其实在部分编译器底下可以:arr[ i ],可以使用变量,下面科普一下
在c99之前,数组表达式只能用常量来表达
在c99之后,数组的大小能用变量来表示,为了支持加长数组,长度通过变量来指定的
变长数组是不能初始化的
2 二维数组的创建和初始化
2.1二维数组的创建
二维数组的创建: int arr [i][j]
元素类型 数组名 常量表达式
2.2二维数组的初始化:
二维数组也分为完全初始化和不完全初始化(这里有点啰嗦了大家了解就行)
完全初始化:int arr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
未完全初始化:int arr[3][4]={1,2,3,4,5,6}
我们可以注意到其实二维数组其实是分为行和列进行排列的
在二维数组初始化的时候,行可以省略列不能省略
这里可以到其实我们其实列就是元素个数只要元素个数定好就会到数量自动换行
二维数组在未完全初始化的时候可以使用括号进行分组:
3一二维数组的使用
3.1一维数组的使用
让我们来看,这里我定义了数组用for循环打印了各个数组的元素在实际的传参中也是这样打印后面我会举例,一维数组可以使用下标引用操作符([]就是这个方括号)对数组中的元素单独拿出来进行使用如下图
二维数组的使用
上图是打印二维数组中的各个元素,和一维数组一样也可以使用下标引用操作符进行单独使用
4一二维数组在内存中的存放
4.1一维数组在内存中的存放:
在说之前我科普一下:在计算机二进制中用零和一表示,可是十六进制就使用1到9无法表示完全·所以在内存中就使用abcdef来表示
如图所示,我们可以得出一维数组在内存中是连续存储的且递增的空间和我们的类型大小有关
4.2二维数组在内中存放:
如上图所示,第一个空间末尾是8加整型4等于12所以用c代替,由此得出二维数组在内存中也是连续存放的,但是它连续存放的方式和一维数组有点类似如图
上面这行就是二维数组在内存中的存放,他是和一维数组的排版类似,但是后期方位不同,所以大家不要搞混淆
5冒泡排序
接下来我就拿一道冒泡函数来举例子一维数组的传参
首先来讲一下函数的规划
冒泡函数理论来说就是用升序的方式把最大的数存放到数组的末尾
这边这个:sizeof(arr)/sizeof(arr[0])这个是用来计算函数元素个数的,如果你的数组未给常量表达式就是用该公式计算,使用for循环进行打印从函数中进行升序之后的数
然后把sz(计算后的数组总元素)传入函数,然后来的函数中
接下来就是函数中,外层循环就是运行了多少趟
趟数就是:10 9 8 7 6 5 4 3 2 1,9 8 7 6 5 4 3 2 1 10,进行升序对比后的数叫做一趟
每次对比后趟数减一所以我们在对比的时候就是(n-i)趟所以10个元素一共就是9趟
其次内层循环就是对比的次数,元素个数减1在减每次的趟数因为每次循环趟数都会增加所以就可以用来递减
最后来进入交换,这个arr[j]其实就是下标的对比如果a>b就进行交换直到比较数字无法比较,但是如上一个数比较没有交换后面还能交换的前提会自动跳到下一个比较
这个if里面就是交换模式,这里还有一个优化就是lesa如果变成一的话就是交换程序里面还是无序的他就会继续进入下一趟但是如果lesa=0那么就跳出本次循环,好处是不管是到多少趟了只要有序了就会停止不会让程序繁琐
这里还有两个要注意的就是数组的传参:数组在函数中传参传入的是数组的首元素地址因为数组传参的时候是一个指针;还有两个特殊情况不是数组首元素地址
一个是用sizeof计算的时候不是那个计算的是所以数组元素的值,如果只有一个地址的值就没发计算
第二个是取地址计算的时候和上面那个差不多,但是取地址的值和首地址打印刚开始是一样的只是在加一后数组地址就加了整个数组的地址
最后感谢大家看到这里,这次就是我这此内容的总结,如有错误请大家指正谢谢😘🥰