数组指针

最近在准备面试的题目,看到指针和数组部分,纠结得很,在了解typedef的过程中,看见了数组指针,看着晕晕乎乎的,就像桥几行代码熟悉下,加深自己的了解。好了,切入正题。
int (*pa)[3] ; //这里我定义了一个数组指针
网上有很多教程教我们如何去读这样的指针,从*开始看,引起我注意的是括号,(*pa),显示这里pa就是代表着一个指针,而(*pa)后面接着一个数组的标志’[]’,所以pa的含义就是:“指向一个含有3个int类型的数组”,简称数组指针,这里为什么不叫指针数组呢?我个人的了解是,我们中国人喜欢把重点放在后面说,前面说的都是无关紧要的东西,就像我们那会写作文那样,什么“画龙点睛”之类的手笔。西方人就喜欢把重要的东西放在前面,后面都是一些什么修辞,比如,我们在做英文阅读的时候,老师就说了,文章的中心句不在首段,就在第二段的首句,很少在第二句。当然这都是我自己的理解,希望不要误解大家。
那么数组指针的是干什么用的呢,它可不是面试官拿来刻意刁难应聘者的。数组指针可以用来指向二维数组,在遍历二维数组的时候,我们就没有必要使用两层循环来打印二维数组了,这样时间复杂度是不是就简化了呢?
我们以前在书上看见二维数组的声明:int a[2][3] ;这个二维数组有三列,当数组指针指向这个数组的时候,实际上二维数组就已经退化成为了一个“一”维数组了,一个大的一维数组,a[0] ,和a[1] ,但是这里a[0]和a[1]里面可不是简单的单个int类型的数据,其实它的里面包含的是一个一维数组,这个一维数组里面有3个int类型的数据。其实在内存中,数组都是紧密的排列中以数组名为起始地址的一段空间里面,没有间隙。
当用一个数组指针指向这个二维数组的时候,p = a ; p 实际就成为了一个行指针:如图所示


现在的问题就是怎么遍历二维数组,也就是说,怎么访问a[0][1] = 2 这个变量,pa = a ,那么pa指向二维数组的起始地址,pa + 1 则表示指向二维数组的第二行,指针加减是要看指针指向的对象类型的,我们来看看指针的类型是什么,指针指向的对象就是:int [3] ,那么pa + 1 ,自然就指向了第二行了。现在问题是如何指向第一行的第一个元素2呢,*(*pa + 1)是不是就OK了。

好了,写段测试代码,加深自己的了解:

#include <stdio.h>

int main()
{
	int a[2][3] = {{1,2,3} ,{4,5,6}} ; 

	int (*pa)[3]  ;  //定义一个数组指针

	pa = a ; //数组指针指向二维数组

	int i = 0 ; 
	//打印第一行数据
	for( i= 0 ;i < 3 ;i++)
	{
		printf("%d\t",*(*pa+i)) ; 
	}
	
	printf("\n") ; 
	
	pa++ ; //数组指针指向二维数组的第二行
	//打印a[1][2]
	printf("a[1][2] = ") ; 
	printf("%d\n" ,*(*pa + 2) ) ; 
	printf("\n") ; 

	return 0 ; 
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值