尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

深入理解指针(3)学习笔记

深入理解指针(3)学习笔记 一、数组名的理解数组名就是第一个元素的地址但是有两个特例1、sizeofarr[])这里算的是整个数组的长度单位为字节。2、arr。这里注意对整个数组取地址和对数组中一个元素取地址结果是不一样的以十个元素的整型数组为例如果arr1跳过的是一个元素的大小即四个字节如果arr1跳过的是整个数组即40个字节。其他情况下都是首元素的地址。二、使用指针访问数组#define_CRT_SECURE_NO_WARNINGS#includestdio.hintmain(){intarr[10]{0};int*parr;inti0;intnsizeof(arr)/sizeof(arr[0]);for(i0;in;i){*pi1;p;//这里记录一个小错误第一行需要固定p让p在一个起始位置上依次加。之前写成*pii1//这在后面p的时候起点直接跑偏。}for(i0;in;i){printf(%d ,arr[i]);//这里写成*pi/i[arr]/(arri)都可以但是第二个写法不推荐。}return0;}三、一维数组传参的本质voidtest(intarr[10])......intmain(){intarr[10]{1,2,3,4,5,6,7,8,9,10}test(arr);return0;}像上述代码下面的arr传到test中时从数组变成了指针即数组降级。此时在test函数中计算数组的长度得到的是指针变量的长度4或8所以需要在main函数中先算出数组的长度。总结一维数组传参的时候形参部分可以写成数组也可以写成指针。因为传参时本质上是在传指针。四、冒泡排序核心思想相邻的两个元素相互比较排序。voidbubble(intarr[5],intn){inti0;//确定趟数for(i0;in;i){intj0;intflag1;//标记第i趟是否有序for(j0;jn-i-1;j)//这里注意j的范围不要越界访问了。{if(arr[j]arr[j1]){flag0;intm0;marr[j];arr[j]arr[j1];arr[j1]m;}}if(flag1)//分清楚赋值符号和判断相等的符号break;}}voidprint(intarr[5],intn){inti0;for(i0;in;i){printf(%d ,arr[i]);}}intmain(){intarr[5]{3,5,2,4,1};intnsizeof(arr)/sizeof(arr[0]);bubble(arr,n);print(arr,n);return0;}自己写的时候出现了两个小错误判断相等的符号错写成了赋值符号还有循环的边界写错了造成了越界访问。注意上面代码中有一个提高程序效率的小技巧。定义了flag来标记数组是否已经是升序如果已经是了直接跳出循环减少多余的比较步骤。五、二级指针intmain(){inta0;int*pa;//一级指针int**ppp;//二级指针return0;}当然以此类推int***ppppp还可以依次写下去 且解引用后*ppp。六、指针数组简单理解数组的每个元素都是指针。七、指针数组模拟二维数组通过指针数组可以把多个一维数组联系在一起即模拟一个二维数组。intmain(){intarr1[3]{0,1,2};intarr2[3]{1,2,3};intarr3[3]{2,3,4};int*arr[3]{arr1,arr2,arr3};inti0;intj0;for(i0;i3;i){for(j0;j3;j){printf(%d ,arr[i][j]);}printf(\n);}return0;}打印结果
返回列表