指针引用一维数组学习

所谓数组元素的指针就是数组元的地址

1. 指针如何引用数组

		int a[10] = {1,3,5,7,9,11,13,15,17,19};
		int * p;
		p = &a[0];
其中数组名 "a" 不代表整个数组,只代表数组首元素的地址。
p = &a[0] 等价于 p = a;

2. 在引用数组元素时指针的运算

当指针指针指向数组元素的时候
可以 p+1 表示指向下一个元素a[1]

  • p+1
  • p-1
  • p++,++p;
  • p–,--p

但两个指针相减,如p1-p2(只有p1和p2都指向同一个数组中的元素时才有意义
在这里插入图片描述
如果p1和p2都指向同一个数组中的元素时,如执行p2-p1,结果是p2-p1的值(两个地址之差)除以数组元素的长度。例如 p2 = &a[5] = 2020,p1 = &a[3] =2012,p2-p1=
(2020-2012)/4 = 2所以就得到两个数组之间差2个元素
这样我们就不需要具体p1和p2的值就可以不用知道两个元素的具体值,而是直接用p2-p1就可知道它们所指元素的相对距离。
另外 地址进行乘、除和相加的运算是没有意义的

3. 通过指针引用数组元素

  • 下标法 如a[i]
  • 指针法 如 *(a+i)
    在这里插入图片描述
    但是其中要注意的是
    1。 指针变量的当前值。例如 p = a[5],指针的当前值就是 a[5]的地址
    2。如果把 ++i改为 ++a 是不行的

    因为数组名a代表数组首元素的地址,它是一个指针型常量,它的值在程序运行期间是固定不变的。既然a是常量,所以a++,++a是无法实现的。

4. 指针的指向

在这里插入图片描述
在这个程序中指针变量p指向某一数组元素,但是实际上指针变量p可以指向数组以后的存储单元。
对p[i]处理成*(p+i),如果指向一个整型数组元素a[0],则p[i]代表a[i]。但是必须注意p的当前值是什么?这个程序如果在输出*p时不把a[0]的地址重新赋值给p的话,此时的p是指向a[9]的,如果进行p++的话 会是一些不知道的数字。

  • p++
    *p; 这个是指向下一元素a[1]

  • *p++ = *(p++)
    由于++和 " * "同级关系 结合方向自右而左

  • 6*(++p)不等价于*(++p)

  • ++(*p)
    表示p所指向的元素值加1

5.用数组名作函数参数

例如
fun(int *arr,int n) = fun(int arr[],int n)

*(arr+i) = arr[i]
实参类型变量名数组名
要求形参的类型变量名数组名或指针变量
传递的信息变量的值实参数组元素的地址
通过函数调用能否改变实参的值不能改变实参变量的值能改变实参数组的值

注意

实参数组名代表一个固定的地址,或者说是指针常量,但形参数组名并不是一个固定的地址,而是按指针变量处理。
最后分析一个简单的案例
在这里插入图片描述

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

匠心点睛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值