当前位置: 首页 > news >正文

深入理解指针(3)

目录

1.数组名的理解

2. 使用指针访问数组

3. 一维数组传参的本质

4. 冒泡排序

5. 二级指针

6.指针数组

7.指针数组模拟二维数组


正文:

1.数组名的理解

数组名实质是数组首元素的地址。验证代码如下:

int arr[10] = {0}; printf("%p\n",&arr[0]); printf("%p\n",arr);//二者结果相同

这里有一段代码,又会提出新的问题:

int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; printf("%d\n",sizeof(arr)); //输出结果为:40

数组名确实是数组的首元素地址,但是有两个例外的情况:

(1)sizeof(数组名),此时数组名表示整个数组,求的是整个数组的内存大小(单位字节)

(2)&数组名,这里的数组名表示整个数组,取出的是整个数组的地址(整个数组的地址与数组首元素的地址不同)

测试代码:

int arr[10] = {1,2,3,4,5,6,7,8,9,10}; printf("&arr[0]=%p\n",&arr[0]); printf("arr =%p\n",arr); printf("&arr =%p\n",&arr); //三者输出结果完全相同

那么 arr 与 &arr 之间的到底有什么区别呢?进行数组+-整数试试:

int arr[10] = {1,2,3,4,5,6,7,8,9,10}; printf("&arr[0] = %p\n",&arr[0]); printf("arr = %p\n",arr); printf("&arr = %p\n",&arr); printf("&arr[0] + 1 = %p\n",&arr[0] + 1); printf("arr + 1 = %p\n",arr + 1); printf("&arr + 1 = %p\n",&arr + 1);

代码结果:

&arr[0] = 0077F820 arr = 0077F820 &arr = 0077F820 &arr[0] + 1 = 0077F824 arr + 1 = 0077F824 &arr + 1 = 0077F848

结论:在指针+-整数时,arr + 1 跳过的是数组的一个元素,而 &arr + 1 跳过的是整个数组,这就很好的解释了 &数组名 代表的是整个数组。

2. 使用指针访问数组

int arr[10] = {0}; int* parr = arr; //利用指针对数组进行输入 for(int i = 0;i < 10;i++) scanf("%d",p + i); //利用指针进行数组打印 for(int i = 0;i < 10;i++) printf("%d",*(p+i));//等价于 printf("%d",arr[i]);

在上述代码中,不难看出:*(p + i) == p[ i ] ,又因为 arr 是数组首元素地址,则:

结论:arr[ i ] == *(arr + i) ;&arr[ i ] == arr + i

3. 一维数组传参的本质

问题:我们之前都是在函数外部计算数组的元素个数,那可以把数组传给一个函数后,函数内部求数组元素的个数吗?

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; } // 结果:sz1 = 10 sz2 = 1

函数形参接收的是数组首元素地址,在函数内部写的 sizeof(arr) ,计算的是一个地址的大小,而不是一个数组的大小。

结论

1. 数组名是数组首元素的地址,在数组传参的时候,传递的是数组名,本质上数组传参传递的是数组首元素的地址。

2. 一维数组传参,形参部分可以写成数组的形式,也可以写成指针的形式

4. 冒泡排序

核心思想:两两相邻元素进行比较。

void bubble_sort (int arr[],int sz) { for(int i = 0;i < sz - 1;i++) { int flag = 1; for(int j = 0;j < sz - 1 - i;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; } for(int i = 0;i < sz;i++) printf("%d ",*(arr + i)); } int main() { int arr[10] = {10,9,8,7,6,5,4,3,2,1}; int sz = sizeof(arr) / sizeof(arr[0]); bubble_sort(arr,sz) return 0; }

5. 二级指针

指针变量也是变量,是变量就会有地址,那么指针变量存放在哪里?

存放指针变量地址的变量,称为二级指针

二级指针变量的运算:

以上述代码为例:

*ppa == pa;**ppa == a;一个 * 解引用一次,两个 * 解引用两次。

6.指针数组

指针数组是存放指针的数组。

parr 是一个数组,数组有 3 个元素,每个元素的类型是 int *

指针数组的每个元素是个地址,又可以指向一块区域。

7.指针数组模拟二维数组

int main() { int arr1[] = {1,2,3,4,5}; int arr2[] = {2,3,4,5,6}; int arr3[] = {3,4,5,6,7}; //数组名是数组首元素的地址,类型是 int* ,就可以存放在 parr 数组中。 int* par[3] = {arr1,arr2,arr3}; for(int i = 0;i < 3;i++) { for(int j = 0;j < 5;j++) printf("%d ",parr[i][j]); printf("\n"); return 0; }

parr[ i ] 是访问 parr 数组的元素,parr[ i ]找到的数组元素指向了整型一维数组,parr[ i ][ j ]

就是整型一维数组中的元素。

二维数组每一行在内存空间上都是连续的,上述代码模拟出二维数组的效果,但是并非完全等同于二维数组。

欢迎大家交流与指正,感谢阅读。

http://www.jsqmd.com/news/1352352/

相关文章:

  • AI智能体实战:如何构建高判断力与高创造力的智能系统
  • 从API调用到AI应用构建:Ling-3.0-flash免费期实战指南
  • C++物理引擎数值稳定性实战:从崩溃到毫秒级精准模拟
  • 2026芜湖/马鞍山考生单招滑档?1+3兜底模式稳上统招大专!怎么报名?联系方式多少? - 最新资讯
  • 网络共享困境突破:VirtualRouter技术深度解析与实战指南
  • RAG系统检索优化实战:从向量焦虑到多路召回与重排架构
  • Spark执行计划与DAG调度核心解析及优化实践
  • OpenClaw本地AI助手部署实战:从Docker部署到核心功能解析
  • Nginx性能调优实战:从参数配置到高级优化
  • 全面战争模组制作革命:Rusted PackFile Manager (RPFM) 让你的创意触手可及!
  • 告别翻源码!这个免费公众号排版工具,帮你一键提取公众号文章所有视频链接 - 鹅鹅鹅ee
  • Yolo系列算法学习笔记——YoloV7知识点梳理与总结
  • Python实战:上市公司财务数据分析与可视化全流程解析
  • LLM智能体分层架构:从数字大脑到工业无人机自主巡检的工程实践
  • 2026昆山装修公司怎么选?半包全包适配攻略及靠谱装企汇总 - 装修新知
  • Python列表相等性判断全解析:从==操作符到自定义对象与性能优化
  • 二元函数凹凸性判断:从海森矩阵到机器学习优化的实战指南
  • Spring文件上传:MultipartFile与File核心区别、转换实践与性能优化
  • Python 循环结构综合练习题
  • 跨越边界:在Windows原生环境中驾驭Btrfs文件系统的完整技术手册
  • 游戏开发中如何通过自动化测试与CI/CD避免新角色沦为Bug源头
  • ADC电压检测实现电池电量百分比显示
  • 奥系论战:终极捷德单挑六强联军的战力推演与设定分析
  • 千亿参数大模型Kimi-K3实测:从部署到性能的深度评测与工程实践
  • AI降重工具测评与学术论文优化指南
  • 筑宅安房屋修缮|日照防水补漏专业公司,解决雨季房屋渗水漏水 - 筑宅安
  • 2026宁波房屋漏水维修哪家靠谱 亲测三家正规公司避坑指南 - 吉林同城获客
  • 2026年广德迎春街正宗土菜炖锅店推荐 - 谁都没有我好看
  • 2026滁州/六安高考没过线?告别校外机构,正规高校复读班来了!怎么报名?联系方式多少? - 最新资讯
  • Python Selenium自动化登录实战:从环境配置到健壮脚本开发