目录
前言
一、数组名的理解
二、使用指针访问数组
三、一维数组传参的本质
四、冒泡排序
五、二级指针
六、指针数组
七、指针数组模拟二维数组
前言
本篇主要讨论以下问题:
1. 数组名通常表示什么,有哪两种例外情况,在例外情况中数组名表示什么
2. 知道使用指针访问数组其实就是指针+-整数和指针解引用的应用
3. 知道 arr[i] 本质是 *(arr+i),即数组首元素的地址偏移后进行解引用
4. 一维数组传参的本质是什么,形参部分究竟有没有创建新的数组,数组的大小是否作为参数传递给被调函数以及为什么
5. 冒泡排序的规则是怎样的,怎样写一个冒泡排序
6. 什么是二级指针
7. 什么是指针数组
8. 怎样用指针数组模拟二维数组
一、数组名的理解
1. 数组名通常表示数组首元素地址 (也可以理解为数组名是一个指针变量,里面存放着数组首元素的地址)。
2. 两个例外情况:
① sizeof(数组名):sizeof中单独放数组名,这里的数组名表示整个数组,sizeof计算的是整个数组的大小,单位是字节。
② &数组名:这里的数组名表示整个数组,取出的是整个数组的地址(整个数组的地址和数组首元素的地址数值上一样,但本身是有区别的,&数组名的指针类型是什么呢,后面会讲)
二、使用指针访问数组
上图中,指针p就是arr,arr[i]表示的本质就是*(arr + i),由加法交换律可得arr[i] == i[arr]。
三、一维数组传参的本质
1. 在数组传参的时候,传递的是数组名,也就是说数组传参本质上传递的是数组⾸元素的地址,也正是如此,在被调函数内部是没办法求得数组的元素个数的,因此在数组传参时通常会把数组的大小也一并传给被调函数。
2. ⼀维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式,但无论写成哪种形式,形参部分表示的都是一个指针,而不是数组 (形参部分并不会创建一个数组)。
四、冒泡排序
#include <stdio.h>
//用冒泡排序把一个整型数组排为升序
//冒泡排序:让相邻的两个元素比较,如果不满足顺序就交换
//每趟冒泡排序可以搞定"最后一个位置"上放的元素,sz个元素sz-1趟就能搞定
//每搞定一趟,最高比较的下标要-1
void BubbleSorrt(int arr[], int sz)
{//趟数int i = 0;for (i = 0; i < sz - 1; i++){int flag = 1;//假设本趟本身就全为升序//一趟冒泡排序int j = 0;for (j = 0; j < sz - i - 1; j++){if (arr[j] > arr[j + 1]){int tmp = 0;tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;flag = 0;//有交换,本趟一定不为全升序}}if (flag){break;}}
}void Print(int arr[], int sz)
{for (int i = 0; i < sz; i++){printf("%d ", arr[i]);}
}int main()
{int arr[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };//降序int sz = sizeof(arr) / sizeof(arr[0]);BubbleSorrt(arr, sz);Print(arr, sz);return 0;
}
五、二级指针
1. 二级指针是用来存放一级指针地址的指针变量。
2. 对二级指针解引用就可以找到其所指向的一级指针,对一级指针解引用就可以找到其所指向的变量。
六、指针数组
1.存放指针的数组叫指针数组,指针数组的每个元素都是相同类型的指针变量。
例如,int* arr[10];、char* arr[5];、char** arr[8];
七、指针数组模拟二维数组
1. arr是数组arr首元素的地址,让arr偏移并解引用就可以找到arr数组中的每个元素,而arr数组中的每个元素是其他数组首元素的地址,对该地址偏移并解引用就可以找到数组arr1、arr2、arr3中的每个元素。
2. arr[0] == *(arr + 0) -->找到数组arr1首元素的地址,arr[0][0] == *(*(arr + 0) + 0),找到arr1中第一个元素。
arr[1] == *(arr + 1) -->找到数组arr2首元素的地址,arr[1][0] == *(*(arr + 1) + 0),找到arr2中第一个元素。
arr[2] == *(arr + 2) -->找到数组arr3首元素的地址,arr[2][0] == *(*(arr + 2) + 0),找到arr3中第一个元素。
本篇文章已完结,谢谢支持!!!