数组名和地址的关系

#include <stdio.h>
int main()
{
	int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
	/*从二维数组的角度看,a代表是二维数组的首元素的地址,
	现在的首元素不是一个简单的整型元素,而是由4个整型元素所组成的一维数组,因此a代表的是首行(即序号为0的起始地址)
	a+1代表的是序号为1的行的起始地址(跨过了4个整型数据,即跨过了1,3,5,7)。*/ 
	printf("%d\t%d\t%d\n",a+1,a[1],&a[1][0]);//a+1的值和a[1]的值和&a[1][0]的值一样,表示的都是第一行第0列的元素地址
	//a[0]+1表示为第0行第一列的元素的地址,1个整型元素占据4个字节,故a[0]+1跨过了1个整形元素,4个字节。 
	printf("%d\t%d\n",a[0]+1,&a[0][1]);//两者都表示的是第0行第1列元素地址值
	/*
		a[0]和*(a+0)等价,a[i]和*(a+i)等价;
		a[0]+1 <-> *a+1 <-> &a[0][1], a[1]+i <-> *(a+1)+i <-> &a[1][i]    (<->表示等价符号) 
	*/ 
	printf("%d\t%d\t%d",a[1]+1,*(a+1)+1,&a[1][1]);//均表示第一行第一列的元素地址 
	return 0;
}

在这里插入图片描述
注:&a[i]和a[i]的值相同,但是&a[i]指的是行,而a[i]指的列。

(1)指向多维数组元素的指针变量

#include <stdio.h>
int main()
{
	int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
	int *p;//p是int *型指针变量 
	for(p=a[0];p<a[0]+12;p++)//使p指向下一个元素 
	{
		if((p-a[0])%4==0)//p移动4次后换行 
			printf("\n");
		printf("%d\t",*p);//输出p指向的元素的值 
	}
	printf("\n");
	return 0;
}

在这里插入图片描述
(2)指向由m个元素组成的一维数组的指针变量
上例的指针变量p是用“int *p:”定义的,它是指向整型元素的,p+1所指向的元素是p所指向的列元素的下一元素(如p指的是a[0][0],则p+1指的是a[0][1])(按在内存中储存的下一整型元素)。
而本例可以改用另一种方法,使p不是指向整型变量,而是指向一个包含m个元素的一维数组。这时,如果p先指向a[0](即p=&a[0]),则p+1不是指向a[0][1],而是指向a[1],p的增加值以一维数组的长度为单位。

#include <stdio.h>
int main()
{
	int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
	int (*p)[4],i,j;//指针变量p指向包含4个整型元素的一维数组(*p两边的括号不能可缺少) 
	p=a;//p指向二维数组的0行 
	for(i=0;i<3;i++)
	{
		for(j=0;j<4;j++)
		{
			printf("%4d",*(*(p+i)+j));
		}
		printf("\n");
	}
	return 0;
}

在这里插入图片描述
详细可以去看《C程序设计(第五版)》谭浩强著

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值