关于指针和数组指针对数组元素的调用的理解

标题 关于指针和数组指针对数组元素的调用的理解

首先,要先清楚指针和数组指针的分别,
指针:计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。


数组指针:eg:int (*p)[n]就是一个数组指针(也称为行指针)
()优先级高,说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。
如要将二维数组赋给一指针,应这样赋值:
int a[3][4];
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
所以数组指针也称指向一维数组的指针,亦称行指针。


明白了指针和数组指针的区别后,接下来是了解指针和数组指针对数组元素的调用。



#include"stdio.h"
int main()
{
int a[3][2]={1,2,3,4,5,6};
int *p; //定义一个指针变量
p=a; //将数组的首地址给指针p
printf("%d
",*p);
}


输出结果:1


而如果直接使用数组指针:



#include"stdio.h"
int main()
{
int a[3][2]={1,2,3,4,5,6};
int (*p)[2]; //注意()的优先级大于[],如果直接int *p[1],则表是为一个指针数组
p=a;
printf("%d
",*p);
}


输出结果:1703708 //为一个地址值


若想正确调用a数组中的数组元素,则需要用**p。


#include"stdio.h"
int main()
{
int a[3][2]={1,2,3,4,5,6};
int (*p)[2];
p=a;
printf("%d
",**p);
}

输出结果:1


为什么会出现指针和数组指针对数组元素调用的方式不同呢?
答:*p是一个指针变量,p指向的其实是a[0]或a[0][0];
而( *p)[2]是一个数组指针,p指向的其实是a[0],a[1]或a[0][0],a[0][1]这样的形式;
也就是说 * p中的p指向的是a数组中a[0][0]的地址,而( * p)[2]中的p指向的是a数组中第一行a[0][0],a[0][1](可以将这两个数组元素看成是二维数组中的一个一维数组)的地址,所以( * ( * p))第一个 * 解析的是二维数组中一维数组的地址,而第二个 * 解析的是二维数组中一维数组的第一个数组元素的地址。
所以,虽然说 p=a;指针p和数组指针p指向的都是数组a的首地址,但是在理解上还是不一样的。

相关文档

  • ☆Step
  • hibernate如何配置自动生成表
  • 成功项目管理之浅析
  • 六年级随笔记叙文
  • 你要学着自己强大阅读题及答案
  • 学年校本培训计划范文
  • 【调剂】河北工程大学2020年接收调剂硕士生公告
  • 手机上显示hd什么意思
  • 鹅口疮怎么治疗小儿鹅口疮治疗五大方法
  • 夏天北京玩水的地方北京玩水圣地水上乐园
  • 恢复出厂设置和刷机有什么区别
  • 8日照市中考满分作文《我依然守住萧萧荒园》
  • Android 简单定义底部弹窗
  • 坚持努力后成功的名言警句 努力和坚持的名言警句
  • Web3.0时代离我们还有多远?(上)
  • 企业销售员工的自我评价
  • 戴口罩的一家人简笔画要怎么画
  • 远程教育学习自我鉴定
  • git避免多次输入账号密码
  • 有关巾帼心向党作文
  • 备胎是什么意思
  • 大学生简短励志故事
  • 没结婚要怎么要回聘金
  • 礼仪个人形象及六要素
  • Nginx??自定义错误页面
  • 为啥手机光出现耳机标志
  • pep五年级下册英语知识点
  • java nio 多路复用_JAVA的网络IO模型彻底讲解|面试
  • 幼儿园六一儿童节亲子活动策划方案
  • 豪猪繁殖障碍有哪些
  • 电脑版