网站推广有哪些方式,阳江招聘网最新消息今天招聘,营销软件商城,网址网站注册大家好啊#xff0c;我是小象٩(๑ω๑)۶ 我的博客#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家#xff0c;希望能够和大家一起交流学习#xff0c;共同进步。 今天我们继续来复习指针… 目录 一、看一段代码二、 一维数组传参的本质三、冒泡排序3.1 基本思想四、二… 大家好啊我是小象٩(๑òωó๑)۶ 我的博客Xiao Xiangζั͡ޓއއ 很高兴见到大家希望能够和大家一起交流学习共同进步。 今天我们继续来复习指针… 目录 一、看一段代码二、 一维数组传参的本质三、冒泡排序3.1 基本思想四、二级指针4.1 基本概念 五、指针数组1 指针数组的定义 七、结尾 一、看一段代码
23 --32
arr[i] -- *(arri)
i[arr] -- *(iarr)int main()
{int arr[10] { 1,2,3,4,5,6,7,8,9,10 };//打印数组的内容使用指针int* p arr;int sz sizeof(arr) / sizeof(arr[0]);int i 0;//输出数组的内容//arr[i] -- *(arri)////[]就是一个操作符而已//for (i 0; i sz; i){//printf(%d , i[arr]);////printf(%d , i[p]);//?//printf(%d , *(i p));//printf(%d , p[i]);//*(pi) p[i]//*(pi) p[i] --- *(ip) i[p]//printf(%d , *(pi));}return 0;
}本质 arr[i] -- *(arri)
二、 一维数组传参的本质
在 C 语言中一维数组传参的本质是传递数组首元素的地址而非整个数组的副本。 数组我们学过了之前也讲了数组是可以传递给函数的我们讨论 一下数组传参的本质。 首先从一个问题开始我们之前都是在函数外部计算数组的元素个数那我们可以把数组传给一个数后函数内部求数组的元素个数吗
#include stdio.h
void test(int arr[])
{int sz2 sizeof(arr) / sizeof(arr[0]);printf(sz2 %d\n, sz2);
}
int main()
{int arr[10] { 1,2,3,4,5,6,7,8,9,10 };int sz1 sizeof(arr) / sizeof(arr[0]);printf(sz1 %d\n, sz1);test(arr);return 0;
} 通过结果我们发现在函数内部是没有正确获得数组的元素个数。 我们知道数组名是数组首元素的地址那么在数组传参的时候传递的是数组名也就是说本质上数组传参传递的是数组首元素的地址。 所以函数形参的部分理论上应该使用指针变量来接收元素的地址。**那么在函数内部我们写sizeof(arr) 计算的是一个地址的大小单位字节而不是数组的大小单位字节。**正是因为函数的参数部分是本质是指针所以在函数内部是没办法求的数组元素个数的。
void test(int arr[])//参数写成数组形式本质上还是指针
{printf(%d\n, sizeof(arr));
}
void test(int* arr)//参数写成指针形式
{printf(%d\n, sizeof(arr));//计算⼀个指针变量的⼤⼩
}
int main()
{int arr[10] { 1,2,3,4,5,6,7,8,9,10 };test(arr);return 0;
}
总结一维数组传参形参的部分可以写成数组的形式也可以写成指针的形式。
三、冒泡排序
3.1 基本思想 冒泡排序Bubble Sort是一种简单的排序算法通过重复遍历待排序的数组依次比较相邻元素的值若顺序错误例如升序时前一个元素大于后一个元素则交换它们的位置。每一轮遍历会将当前未排序部分的最大或最小元素“冒泡”到其正确的位置。 冒泡排序的核心思想就是两两相邻的元素进行比较。
//⽅法1
void bubble_sort(int arr[], int sz)//参数接收数组元素个数
{int i 0;for (i 0; i sz - 1; i){int j 0;for (j 0; j sz - i - 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 sz - 1; i){int flag 1;//假设这⼀趟已经有序了int j 0;for (j 0; j sz - i - 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;
}数组传参的时候传递是数组首元素的地址
1.函数的形参可以写成数组也可以写成指针
2.所以在函数内没办法计算数组的元素个数
3.所以形参的数组和实参的数字是同一个数组 void bubble_sort(int arr[], int sz)
{int i 0;//趟数for(i 0; i sz-1; i){int flag 0;//假设已经有序//处理一趟排序的过程 - 处理多少对数据for (int j 0; j sz-1-i; j){if (arr[j] arr[j 1]){flag 1;int tmp arr[j];arr[j] arr[j 1];arr[j 1] tmp;}}if (flag 0){break;}}
}void print_arr(int arr[], int sz)
{int i 0;for (i 0; i sz; i){printf(%d , arr[i]);}printf(\n);
}int main()
{//3,1,7,5,8,9,0,2,4,6//排序 - 排成升序//int arr[] {9,8,7,6,5,4,3,2,1,0};int arr[] {1,2,3,4,5,6,7,8,9,10};//冒泡排序int sz sizeof(arr) / sizeof(arr[0]);print_arr(arr, sz);bubble_sort(arr, sz);print_arr(arr, sz);return 0;
}四、二级指针 4.1 基本概念
指针的指针二级指针**是指向指针的指针。 层级关系二级指针存储的是一级指针的地址而一级指针存储的是变量的地址。 指针变量也是变量是变量就有地址那指针变量的地址存放在哪里 这就是二级指针 。 对于二级指针的运算有 • *ppa 通过对ppa中的地址进行解引用这样找到的是 pa *ppa 其实访问的就是 pa
int b 20;
*ppa b;//等价于 pa b;**ppa 先通过 *ppa 找到 pa ,然后对 pa 进行解引用操作 *pa 那找到的是 a
**ppa 30;
//等价于*pa 30;
//等价于a 30;五、指针数组 C语言中的指针数组是一种特殊的数组其元素都是指针类型。每个元素可以指向不同类型或相同类型的数据常用于管理多个地址如字符串数组、动态内存分配等。
指针数组是指针还是数组 我们类比一下整型数组是存放整型的数组字符数组是存放字符的数组。 那指针数组呢是存放指针的数组。
1 指针数组的定义
语法数据类型 *数组名[数组长度];
特点数组的每个元素都是一个指针需单独初始化后才能使用。
示例
int *ptr_arr[5]; // 定义一个包含5个整型指针的数组
char *str_arr[3]; // 定义一个包含3个字符指针的数组指针数组的每个元素是地址又可以指向一块区域。
七、结尾
这一课的内容就到这里了下节课继续学习指针的其他一些知识 如果内容有什么问题的话欢迎指正有什么问题也可以问我