多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

C语言指针(3)

C语言指针(3) 目录1. 数组名的理解2. 使⽤指针访问数组3. ⼀维数组传参的本质4. 冒泡排序5. ⼆级指针6. 指针数组7. 指针数组模拟⼆维数组1. 数组名的理解对于数组名arr而言当它不以sizeof(arr)或arr的形式出现时arr都相当于arr[0]。当arr以sizeof(arr)或arr的形式出现时arr代表的是整个数组sizeof(arr)表示整个数组的长度arr表示取整个数组的地址。intarr[10]{1,2,3,4,5,6,7,8,9};printf(%p,arr);printf(%p\n,arr1);//地址数值比arr[0]多4printf(%p\n,arr1);//地址数值比arr[0]多是402. 使⽤指针访问数组#includestdio.hintmain(){intarr[10]{0};inti0;intszsizeof(arr)/sizeof(arr[0]);int*parr;for(i0;isz;i){scanf(%d,pi);//或者scanf(%d,arri);}for(i0;isz;i){printf(%d,*(pi));//或者printf(%d,*(arri));}}因为parrarr[0],所以在上述代码中他们访问数组是等效的。因为arrp都是首元素地址所以p与arr在此次等效的所以我们可以使⽤arr[i]访问数组的元素也可以用p[i]访问数组也就是说arr[i]在这里等价于p[i]。for(i0;isz;i){printf(%d,*(pi));//或者printf(%d,p[i]);}将*(pi)换成p[i]也是能够正常打印的所以本质上p[i]是等价于*(pi)。同理arr[i] 应该等价于*(arri)。数组元素的访问在编译器处理的时候也是转换成⾸元素的地址偏移量求出元素的地址然后解引⽤来访问的。3. ⼀维数组传参的本质数组名是数组⾸元素的地址那么在数组传参的时候传递的是数组名也就是说本质上数组传参传递的是数组⾸元素的地址。因为参数传递的是地址所以函数参数本质上是指针所以⼀维数组传参形参的部分可以写成数组的形式也可以写成指针的形式。#includestdio.hvoidtest(intarr[])//void test (int* arr){printf(%d\n,sizeof(arr));}intmain(){intarr[0]{1,2,3,4,5,6,7,8,9,10};test(arr);return0;}数组传参给函数时会发生数组降级变为指针的现象。4. 冒泡排序将一堆数字两两进行比较从小到大或从大到小进行排序。#includestdio.hvoidbubble_sort(intarr[],intsz){inti0;for(i0;isz;i){intflag1;for(intj0;jsz;j){if(arr[j]arr[j1]){flag0;inttmp0;tmparr[j1];arr[j1]arr[j];arr[j]temp}}if(flag1)break;}}intmain(){intarr[]{3,1,7,2,5,3,6,,4};intszsizeof(arr)/sizeof(arr[0]);bubble_sort(arr,sz);inti0;for(i0;isz;i){printf(%d,arr[i]);}return0;}5. ⼆级指针int a10; int* paa; int**ppap指针用来存放变量地址但是指针变量本身也有地址它也能存在指针中一级指针变量地址存在二级指针变量中二级指针变量地址存在三级指针变量中但是三级指针变量已经很少用了。图片来源比特6. 指针数组指针数组也是数组是存放指针变量的数组。int arr1[3]{0,1,2}; int arr2[3]{4,5,6} char arr[3]{0,1,3}; int *arr[3]{arr1,arr2};指针数组存放的是数组首元素地址。7. 指针数组模拟⼆维数组#includestdio.hintmain(){intarr1[4]{1,2,3,4};intarr2[4]{5,6,7,8};intarr3[4]{9,10,11,12};int*arr[3]{arr1,arr2,arr3};for(inti0;i3;i){for(intj0;j4;j){printf(%d,arr[i][j]);}printf(\n);}return0;}它模拟二维数组但是并非二维数组,二维数组是一个整体,而模拟的数组是三个数组的组合。
返回列表