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

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

首先,要先清楚指针和数组指针的分别,
指针:计算机科学中,指针(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\n",*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\n",*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\n",**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的首地址,但是在理解上还是不一样的。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值