数组与指针
指向数组的指针
一、数组与指针的关系:
1.数组:
数组名表示数组的首地址——数组名是一种指针;
数组名表示的地址不能改变——指针常量。
2.数组的指针
=数组的起始位置=与数组名表示的指针相同 =数组的第一个元素的地址相同
二、数组和指针用法区别:
1.定义指针时:只分配一段用来存放地址的空间,没有分配存放数据的空间;
2.定义数组时:为所以元素分配相应的连续的存储空间,但没有存放地址的空间。
三、指针对数组的引用:
1.指针指向数组的首地址;数组名代表数组首元素的a[0]地址,即相当于&a[0];
例: int a[4];
(1) &a 是“指向数组”的指针;
&a+1将跨越16个字节:数组a四个元素,每个元素占4个字节
&a相当于管辖范围“上升”一级;
注:&a 指向整个数组,a指向首元素,但是所指向的地址相同;
(2)* a 是数组的第一个元素a[0]; 即*a等价于a[0];
*a 相当于管辖范围“下降”一级;
2. a==*p==a[0]
a[i]==*(p+i)
3.利用指针引用数组
1.定义
数组int a[10]; 指针 int*pointer;
2.赋值
pointer=a; 等价于pointer=&a[0];
3.数组访问:
pointer+i; 等价于a=i; 等价于&a[i];
*(pointer +i); 等价于*(a+i)等价于 a[i];
注意易错:
指针运算:int *p=&a[0];
1. a++: 没有意义,数组名的值不能改变,是非法操作;
p++:p + / - 指针所指向的存储单元所占的字节数加减;
p++为下一个元素的地址。
例题:
输出结果为 5.
分析:*p =a+3 ——>*p=a[3]
p[2] ——>p[0]=a[3],p[2]=a[6]
2.指针做加减运算一定要注意有效范围
int a[5]; int *iptr=&a[1]; iptr --; //指向&a[0] *iptr = 3; //a[0]=3 iptr--; //指向&a[-1],超出范围,危险 *iptr = 6; //危险
四、二维数组指针
1.定义:int (*p)[4];
先定义一个指向a的指针变量p;数组类型为int [4];即a所包含的每一个一维数组的类型。即p指向一个“包含4个int型元素的一维数组”
2.等价关系
(1) P+i等价于&a[i];
(2) *(p+i)等价于a[i];
(3) *(p+i)+j 等价于a[i]+j 等价于&a[i][j];
(4) *(*(p+i)+)等价于 a[i][j];
——> a+1行加一即a[ 1 ],*(a)+1才是列的移动即a[0][1](地址加一)
3.数组表
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 我与微信审核的“相爱相杀”看个人小程序副业
· DeepSeek “源神”启动!「GitHub 热点速览」
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库