指针与一维数组

注:数组元素的指针就是数组元素的地址,数组名就是数组中首个元素的地址且是常量不能改变。

1、对一维数组元素的访问共有三种方式:

1.通过数组下标访问数组元素;

2.通过地址访问数组元素:

int a[10];
for(int i=0;i<10;i++)
{
	*(a+i)=i;
}

![[Pasted image 20231130111429.png]]

3.通过指针访问数组元素:

int a[10];
int *p=a;
for(int i=0;i<10;i++)
{
	*(p+i)=i;
}

![[Pasted image 20231130111525.png]]

注:在这里变量指针p和常量指针a是有区别的。a是一个常量不可以改变,而p是一个变量,可以去改变p的值,即p是可以移动的,而a是不能够移动的。所以上面的3.的程序还可以写为:
int a[10];
int *p=a;
for(int i=0;p<(a+10);i++)
{
	*(p++)=i;
}
实际上p++的自增运算要比p+i算术运算快很多,因此指针的执行效率比地址更高。

![[Pasted image 20231130120643.png]]

2、指针变量的算术运算

指针与整数的加减运算。对指针变量加上或减去一个整数,表示将该指针后移或前移。

两个同类型指针的减法运算。对两个相同类型的指针变量进行减法运算,表示这两个指针之间有多少个存储单元。

指针变量没有与浮点数的加减运算,也没有乘除运算,也没有两个指针变量之间的加、乘、除运算。

因为数组占用一段连续的内存空间。因此指针的算术运算通常用于数组中。(但是指针变量没有乘除等运算)

![[Pasted image 20231130121910.png]]

3、指针变量的关系运算

同类型指针之间进行比较运算。不同类型指针之间的比较没有意义。

假设p和q是两个同类型的指针变量,则:

p == q:判断指针p和q是否指向同一存储单元 。
p>q:指针p所指存储单元在指针q所指存储单元的后面。
p!=NULL:判断指针p是否为空指针。

![[Pasted image 20231130200241.png]]

一维数组作为参数的特点:形参数组和实参数组是同一个数组。主程序与子函数分别用不同的名字,共用一块空间。因此在子程序中,通过对形参数组的任何改变,都会影响相应的空间,导致实参数组发生改变。

数组中的[ ]是变址运算符,如a[i]的意思是先按a+i计算地址,然后再找出地址单元中的内容即*(a+i)。

如果指针变量p1和p2都指向同一数组,若p2-p1,则p2-p1的结果为两个地址之差再除以数组元素的长度,如int a[N],p2指向a[5](地址为2020),p1指向a[3](地址为2012),则p2-p1的答案为(2020-2012)/4=2。p2-p1的结果的含义是p2所指的元素与p1所指的元素之间差2个元素。

要注意带下标的指针变量,指向数组元素的指针变量也是可以带有下标的。因为在程序编译时,p[i]被转换为*(p+i),若p是指向a[3] (即p=&a[3]),则此时的p[2]并不是指向a[2]的,而是指向a[3+2]的。(个人感觉这种写法容易造成理解错误,不推荐使用)

p[2] == * ( (p+3)+2);
  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值