目录
前言
本篇主要讨论以下问题:
数组名通常表示什么,有哪两种例外情况,在例外情况中数组名表示什么
知道使用指针访问数组其实就是指针+-整数和指针解引用的应用
知道 arr[i] 本质是 *(arr+i),即数组首元素的地址偏移后进行解引用
一维数组传参的本质是什么,形参部分究竟有没有创建新的数组,数组的大小是否作为参数传递给被调函数以及为什么
冒泡排序的规则是怎样的,怎样写一个冒泡排序
什么是二级指针
什么是指针数组
怎样用指针数组模拟二维数组
一、数组名的理解
数组名通常表示数组首元素地址 (也可以理解为数组名是一个指针变量,里面存放着数组首元素的地址)。
两个例外情况:
①++sizeof(数组名)++:sizeof中单独放数组名,这里的数组名表示整个数组,sizeof计算的是整个数组的大小,单位是字节。
② ++&数组名++:这里的数组名表示整个数组,取出的是整个数组的地址(整个数组的地址和数组首元素的地址数值上一样,但本身是有区别的,&数组名的指针类型是什么呢,后面会讲)
二、使用指针访问数组
上图中,指针p就是arr,arr[i]表示的本质就是*(arr + i),由加法交换律可得arr[i] == i[arr]。
三、一维数组传参的本质
在数组传参的时候,传递的是数组名,也就是说++数组传参本质上传递的是数组⾸元素的地址++ ,也正是如此,++在被调函数内部是没办法求得数组的元素个数++的,因此在数组传参时通常会把数组的大小也一并传给被调函数。
++⼀维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式++ ,但无论写成哪种形式,++形参部分表示的都是一个指针,而不是数组++ (形参部分并不会创建一个数组)。
四、冒泡排序
cpp
#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.存放指针的数组叫指针数组,指针数组的每个元素都是相同类型的指针变量。
例如,int* arr[10];、char* arr[5];、char** arr[8];
七、指针数组模拟二维数组
arr是数组arr首元素的地址,让arr偏移并解引用就可以找到arr数组中的每个元素,而arr数组中的每个元素是其他数组首元素的地址,对该地址偏移并解引用就可以找到数组arr1、arr2、arr3中的每个元素。
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中第一个元素。
本篇文章已完结,谢谢支持!!!