【C语言入门级教学】冒泡排序和指针数组
文章目录
- 1.冒泡排序
- 2.⼆级指针
- 3.指针数组
- 4.指针数组模拟⼆维数组
1.冒泡排序
冒泡排序的核⼼思想:两两相邻的元素进⾏⽐较。
//⽅法1
void bubble_sort(int arr[], int sz)//参数接收数组元素个数
{ int i = 0;for(i=0; i-1; i++) { int j = 0; for(j=0; j-1; j++) { if(arr[j] > arr[j+1]) { int tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; } } }
}
int main()
{ int arr[] = {3,1,7,5,8,9,0,2,4,6};int sz = sizeof(arr)/sizeof(arr[0]); bubble_sort(arr, sz); int i = 0; for(i=0; i<sz;i++)printf("%d ", arr[i]);
}return 0;
}
//⽅法2 - 优化
void bubble_sort(int arr[], int sz)//参数接收数组元素个数
{ int i = 0; for(i=0; i-1; i++) { int flag = 1;//假设这⼀趟已经有序了 int j = 0; for(j=0; j-1; j++) { if(arr[j] > arr[j+1]) { flag = 0;//发⽣交换就说明,⽆序 int tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; } } if(flag == 1)//这⼀趟没交换就说明已经有序,后续⽆序排序了 break; }
}
int main()
{ int arr[] = {3,1,7,5,8,9,0,2,4,6}; int sz = sizeof(arr)/sizeof(arr[0]); bubble_sort(arr, sz); int i = 0; for(i=0; i<sz;i++)printf("%d ", arr[i]);
} return 0;
}
2.⼆级指针
指针变量也是变量,是变量就有地址,而指针变量的地址存放在⼆级指针中。
⼆级指针画图
对于⼆级指针的运算有:
• *ppa 通过对ppa中的地址进⾏解引⽤,这样找到的是 pa , *ppa 其实访问的就是 pa .
int b = 20
*ppa = &b;//等价于 pa = &b;
• * *ppa 先通过 *ppa 找到 pa ,然后对 pa 进⾏解引⽤操作: * pa ,那找到的是 a .
**ppa = 30;
//等价于*pa = 30;
//等价于a = 30;
3.指针数组
指针数组是指针还是数组? 我们类⽐⼀下,整型数组是存放整型的数组,字符数组是存放字符的数组。 那指针数组就是存放指针的数组。
整型数组和字符数组
指针数组的每个元素都是⽤来存放地址(指针)的。
如下图:
指针数组的每个元素是地址,⼜可以指向⼀块区域。
4.指针数组模拟⼆维数组
#include<stdio.h>
int main()
{ int arr1[] = {1,2,3,4,5}; int arr2[] = {2,3,4,5,6}; int arr3[] = {3,4,5,6,7}; //数组名是数组⾸元素的地址,类型是int*的,就可以存放在parr数组中 int* parr[3] = {arr1, arr2, arr3}; int i = 0; int j = 0; for(i=0; i<3; i++) { for(j=0; j<5; j++) { printf("%d ", parr[i][j]); } printf("\n"); }return 0;
}
parr数组的画图演⽰
parr[i]是访问parr数组的元素,parr[i]找到的数组元素指向了整型⼀维数组,parr[i][j]就是整型⼀维数组中的元素。
上述的代码模拟出⼆维数组的效果,实际上并⾮完全是⼆维数组,因为每⼀⾏并⾮是连续的