4-7 二维数组的运算和指针

本文详细介绍了指针如何与二维数组交互,包括指针指向二维数组的数组名、第一维和第二维。强调了数组名表示首元素的首地址,并解释了不同维度的数组元素如何使用指针进行访问。

4.7.1 指针指向二维数组的数组名

(1)二维数组的数组名表示二维数组的第一维数组中首元素(也就是第二维的数组)的首地址;
(2)二维数组的数组名a等同于&a[0],这个和一维数组的符号含义是相符的;
(3)用数组指针来指向二维数组的数组名是类型匹配的;

#include <stdio.h> 
int main(void)
{	
	int a[2][5] = {{1,2,3,4,5},{6,7,8,9,10}};	
	//int *p1 = a;	//等号两边类型不匹配	
	//int **p2 = a;	//等号两边类型不匹配		
	int (*p3)[5];	//数组指针,指针指向一个数组,数组有5个int类型元素	
	p3 = a;		//a是二维数组的数组名,作为右值表示二维数组第一维的数组的首元素首地址						
			//等同于&a[0],可以写成这样 p3 = &a[0];	
	printf("a[0][3] = %d\n",*(*(p3+0)+3));	
	printf("a[1][3] = %d\n",*(*(p3+1)+3));	
	return 0;
}

4.7.2 指针指向二维数组的第一维

(1)用int *p来指向二维数组的第一维a[i];

#include <stdio.h> 
int main(void)
{	
	int a[2][5] = {{1,2,3,4,5},{6,7,8,9,10}};		
	//指针指向二维数组的第一维	
	//int *p4 = &a[0];		//不可以,等号两边类型不匹配	
	int *p5 = a[0];			//a[0]表示二维数组的第一维的第一个元素,相当于							
					//第二维的整体数组的数组名。数组名又表示数组首元素							
					//首地址,因此a[0]等同于&a[0][0]	
	//int *p6 = &a[0][0];		//所以可以写成是int *p = &a[0][0];	
	printf("a[0][4] = %d\n",*(p5+4));	//结果为5
	int *p6 = a[1];	
	printf("a[1][1] = %d\n",*(p6+1));	//结果为7
	return 0;
}

4.7.3 指针指向二维数组的第二维

(1)二维数组的第二维元素其实就是普通变量了(a[1][1]其实就是int类型的7),已经不能用指针类型和它相互赋值了。
(2)除非int *p = &a[i][j];类似于指针指向二维数组的第一维。总结:二维数组和指针的纠葛,关键就是2点:
第一点,数组中各个符号的含义。
第二点,数组的指针式访问,尤其是二维数组的指针式访问。
第三点,记住:不管数组是几维的,数组名都表示数组首元素的首地址。比如:如果数组是二维的a[2][5],那么对于它的首元素就是第一维的第一个数组a[0],即二维数组的首元素是一个数组,a = &a[0],所以要存储一个数组的首地址就要用数组指针;那么对于第一维的元素a[0]、a[1],它们本身也是一个数组,它们作为数组名代表的也是首元素的首地址,a[0]数组的首元素是a[0][0],是一个int类型的数.所以a[0] = &a[0][0].要用int *来指向它。首元素是什么类型我们就用什么类型的指针来指向它。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

非主流的豆瓣

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

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

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

打赏作者

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

抵扣说明:

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

余额充值