摘要:代码修正后修改后,我们可以排列无限个数字这样,一个冒泡排序就完成了。,数组名表示整个数组。
首先感谢一位博主: 原来45 他写的博客内容十分详细,为我创造博客提供了莫大的帮助,也为我解决了很多困难。
先贴出2篇他的文章
C语言从入门到入土(入门篇)(数组p1)_原来45的博客-CSDN博客
C语言从入门到入土(入门篇)(数组p2以及对递归的补充)_原来45的博客-CSDN博客
目录
int arr1[10]={1,2,3}; //这里代表前三个数初始化为1,2,3,而后面剩下的数组全部初始化为0; int arr2[]={1,2,3,4}; //这里表示这个数组的4个数字被初始化成了1,2,3,4,总共4个元素char arr3[]={"a",98,"c"}; //这里的98实际上储存着的是b的ASCII码值char arr4[]="abcdef"; //这个数组储存了7个元素,最后一个是/0
当用双引号包括时,结尾会自动加一个/0。
sizeof 和 strlen 的区别:
1)strlen是一个库函数,计算的是字符串的长度,并且只能针对字符串(无法针对整型的数),关注字符串中是否有/0,同时strlen计算的是/0之前的字符个数。即/0不会被strlen记录大小。
2)sizeof是一个操作符(运算符),sizeof是用来计算变量所占空间内存大小的,任何类型都是可以使用的,只关注空间大小,不在乎内存中是否存在/0。即/0也会被sizeof记录大小。
创建的方式如下:
int arr [3][4];char arr[3][5];double arr[2][4];
这里以 int arr[3][4] 为例,看看二维数组是怎么存放数据的
3指的是有3行(行竖着) 4指的是有4列(列横着)
如何初始化呢?
int arr [ 3 ][ 4 ] = { 1 , 2 , 3 , 4 };int arr [ 3 ][ 4 ] = {{ 1 , 2 },{ 4 , 5 }};int arr [][ 4 ] = {{ 2 , 3 },{ 4 , 5 }}; //注意这里,行可以省略,列不能省略
那如果初始化没有那么多数字呢?不够的数字就会被初始化成0。
同时,也可以这样子初始化
怎么使用二维数组呢?
二维数组如何存储呢?
其实二维数组在内存中也是连续开辟空间的,每一个数字往后4个字节才是下一个数字。只不过为了方便理解,把二维数组画成矩阵的形状更加方便理解。
举个例子:数组共有十个数,而你访问了第十一个数,这就叫越界。
这里越界了但是没有报错:
这里报错了:
什么事冒泡排序?
现有一个有10个数的数组,10个数字随机排序,让其有序排列,这就是冒泡排序。
首先我们先来了解如何求一个数组的长度:
int sz = sizeof(arr) / sizeof(arr[0]);
用这个数组的总占空间大小除以这个数组第一个元素所占空间大小,就得到了这个数组的长度。
我们先写主函数:
int main(){ int arr[] = { 3,6,4,5,8,0,7,9,1,2};//定义一个数组 bubble_sort(arr, sz);//调用函数 int i = 0; for (i = 0; i < sz-1; i++) { printf("%d ", arr[i]);//打印数组的每一位 } return 0;}
排序函数,核心思想:两个数相比较,如果前一个数比后一个数大,两个数字就交换位置
void bubble_sort(int arr[]){int sz = sizeof(arr) / sizeof(arr[0]); int j = 0; for (j = 0; j < sz - 1; j++)//我们比的时候只在同一个位置比,然后后面谁小我们就把谁换过来,一直到最后一个数我们就发现有sz个数,我们就要进行sz-1趟比较 { int k = 0; for (k = 0; k < sz - 1 - j; k++)每一趟比较的次数就是 sz-1 再 -j(因为前面的数已经排好了所以减去) { if (arr[k] >= arr[k + 1]) { int tmp = arr[k]; arr[k] = arr[k + 1]; arr[k + 1] = tmp; } } }}
代码运行,发现代码没有达到我们想要的作用,我们可以打开调试看一下:
为什么sz的值是1呢?哪里出问题了呢?
当我们传递arr时,传递的其实是首元素地址,形参接受的也是首元素地址,arr为指针,用sizeof算出来的大小是4,除以arr第一个元素的大小,4/4=1,所以我们要把sz放在主函数里面求,直接传一个整形的sz的值给函数。
代码修正后:
void bubble_sort(int arr[],int sz){ int j = 0; for (j = 0; j < sz - 1; j++) { int k = 0; for (k = 0; k < sz - 1 - j; k++) { if (arr[k] > arr[k + 1]) { int tmp = arr[k]; arr[k] = arr[k + 1]; arr[k + 1] = tmp; } } }}int main(){ int arr[] = {3,5,7,9,1,2,4,6,0}; int sz = sizeof(arr) / sizeof(arr[0]); bubble_sort(arr, sz); int i = 0; for (i = 0; i < 10; i++) { printf("%d ", arr[i]); } return 0;}
修改后,我们可以排列无限个数字
void bubble_sort(int arr[],int sz){ int j = 0; for (j = 0; j < sz - 1; j++) { int k = 0; for (k = 0; k < sz - 1 - j; k++) { if (arr[k] >= arr[k + 1]) { int tmp = arr[k]; arr[k] = arr[k + 1]; arr[k + 1] = tmp; } } }}int main(){ int arr[] = { 3,2,6,666666,55555555,7777777,2572457,2472457,568458,59679,2,4,7,8,4,9,4,2,8,1,4}; int sz = sizeof(arr) / sizeof(arr[0]); bubble_sort(arr, sz); int i = 0; for (i = 0; i < sz-1; i++) { printf("%d ", arr[i]); } return 0;}
这样,一个冒泡排序就完成了。
先说结论:数组名是数组首元素的地址。
即
printf ( "%p/n" , arr);printf ( "%p/n" , & arr[0]);//两个表达式意思相等
但有两个例外:(在此假设数组名字定为arr)
1. sizeof(arr) ,计算的是整个数组的大小。 sizeof 内部多带带放一个数组名,数组名表示整个数组。
2. &arr,取出的是数组的地址。 &arr,数组名表示整个数组。
对于第二点,额外补充一下:
如果 &arr +1,即 数组+1 则会跳过这个数组所有的数字,会在内存中直接显示到这个数组最后一个数字的后面。
在此,数组的基础知识就讲完了,消化去吧~下一篇就是恐怖的井字棋!
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/123498.html
摘要:我们以冒泡排序为例,模拟实现函数。交换每单位字节对于的二进制序列这样,冒泡排序就能排序多种数据类型,模拟实现了函数,当然也可以使用其他的排序方法模拟实现函数。 ⭐️...
摘要:冒泡排序就这么简单在我大一的时候自学语言和数据结构,我当时就接触到了冒泡排序当时使用的是语言编写的。我最开始接触的就是冒泡排序,所以这篇博文主要讲的是冒泡排序。 冒泡排序就这么简单 在我大一的时候自学c语言和数据结构,我当时就接触到了冒泡排序(当时使用的是C语言编写的)。现在大三了,想要在暑假找到一份实习的工作,又要回顾一下数据结构与算法的知识点了。 排序对我们来说是一点也不陌生了,当...
摘要:故使用无具体类型,又称通用类型,即可以接收任意类型的指针,但是无法进行指针运算解引用,整数等。求指针所占字节而不是解引用访问权限大小。数组就是整个数组的大小,数组元素则是数组元素的大小,指针大小都为。 ...
阅读 2454·2021-11-16 11:45
阅读 2422·2021-10-11 10:59
阅读 2233·2021-10-08 10:05
阅读 3722·2021-09-23 11:30
阅读 2331·2021-09-07 09:58
阅读 754·2019-08-30 15:55
阅读 750·2019-08-30 15:53
阅读 1906·2019-08-29 17:00