C语言深入研究指针2

📅 2026/8/11 3:43:49
C语言深入研究指针2
前言本人的技术笔记会优先发布在个人站点longyxblg.cn数组名的理解数组名本来就是地址来做一个测试int arr[5] { 1,2,3,4,5 }; printf(%p\n, arr); printf(%p\n, arr[0]);可以看到数组名本来就是地址是数组首元素的地址那么就可以使用数组名完成遍历数组intarr[5]{1,2,3,4,5};for(inti0;i5;i){intn*(arri);printf(%d ,n);}数组名通常来说就是数组首元素的地址但是有两个特殊情况intarr[5]{1,2,3,4,5};printf(%p\n,arr[0]1);printf(%p\n,arr1);printf(%zd\n,sizeof(arr));在 sizeof() 中的数组名表示的是整个数组arr 取出来的是整个数组的地址使用指针变量访问数组既然数组名是数组首元素的地址那么是否可以将数组名放在一个指针变量中然后用这个指针变量访问数组intarr1[5]{0};int*p1arr1;for(inti0;i5;i){scanf(%d,p1i);}for(inti0;i5;i){printf(%d ,p1[i]);}一维数组传参的本质一维数组传参的本质实际上传的是数组首元素的地址而非是将整个数组传过去voidtest(intarr[]){intszsizeof(arr)/sizeof(arr[0]);printf(%d\n,sz);}intarr[10]{0};test(arr);printf(%d\n,sizeof(arr)/sizeof(arr[0]));可以看到函数内部并没有正确获取数组的个数。这可以证明函数形参接受到的数组名实际上是首元素的地址在函数内部调用sizeof(arr) 计算的实际上是一个地址的大小而不是一个数组的大小。二级指针用于存放指针变量的地址的变量称为二级指针对于二级指针同样可以使用 * 操作符inta10;int*paa;int**ppapa;printf(%p\n,pa);printf(%p\n,*ppa);printf(%d\n,**ppa);指针数组专门用于存放指针的数组称为指针数组intarr1[5]{1,2,3,4,5};int*parr1[5];for(inti0;i5;i){// 往 parr1 中放入 arr1 中对应下标的元素的地址parr1[i]arr1i;}for(inti0;i5;i){// 每一个都是指针要解引用printf(%d ,*parr1[i]);}指针数组模拟二维数组可以利用指针数组模拟二维数组intarr1[3]{1,2,3};intarr2[3]{4,5,6};intarr3[3]{7,8,9};int*parr[3]{arr1,arr2,arr3};上述代码 parr[0] 等价于 arr1parr[1] 等价于 arr2parr[2] 等价于 arr3intarr1[3]{1,2,3};intarr2[3]{4,5,6};intarr3[3]{7,8,9};int*parr[3]{arr1,arr2,arr3};for(inti0;i3;i){for(intj0;j3;j){printf(%d ,parr[i][j]);}printf(\n);}利用指针变量进行冒泡排序冒泡排序就是数组中相邻两个数进行比较如果存在大小关系按需求进行交换位置。当一轮比较下来该数组中最小(最大)的数就会被放在数组的末尾在下一轮比较中就不需要比较上一轮已经被置于末尾的数。假设当前比较轮次为 i数组长度为 sz ,那么当前这轮比较次数为 sz - i 次nt arr[10]{53,65,88,75,10,69,62,40,57,99};int*parrarr;for(inti0;i9;i){intflag0;// 通过这个判断需不需要结束循环for(intj0;j9-i;j){if(parr[j]parr[j1]){inttempparr[j1];parr[j1]parr[j];parr[j]temp;flag1;// 交换了就赋值}}if(!flag){// 如果有一轮没发生交换 就说明已经排序完成了 提前跳出循环break;}}for(inti0;i10;i){printf(%d ,arr[i]);}