C/C++之数组与指针关系-全解全息

/************************************************************************/
/* 
	一维数组名是一个指针常量,其值是此数组的第一个元素的地址,即此数组的首地址
所以,它可以直接赋值给指针变量,因为其数据类型都是地址类型。
	二维及多维(n)数组名不是像一维数组名那样的指针常量,是指向其(n-1)维数组
的指针,因此,是不能像一维数组名那样赋值给指针变量的。多维数组在赋值时遵循的是最深维优先原则,
即赋值最先付给右边维数最深的维。操作时遵循的是左优先原则,即在操作时先确定的是最左边的维,
如定义数组int i[2][3][4][5][6];则i[1][2]表示的是最先把最左边的维给确定了的地址指针,
即i[1][2][0][0][0]
                                                              */
/************************************************************************/

#include <STDIO.H>

int main(void)
{
	char i[2][8][8] = {"hello!"};//二维及以上的数组必须使用相应数量的大括号(都至少加一个大括号),其遵循的是最深优先原则,即当没有全部赋值时,其最先来赋值的是最深的维,即最右边的那一维,之后是次右边的,以此类推,没有赋值的,将被初始化为空。
	char * p;

//	p = i[0];        //错误,i[0]表示的是指向二维数组的指针
	p = i[0][0];  //正确,i[0][0]表示的是一维数组的地址
//  p = i[0][0][0];  //错误,i[0][0][0]表示的是具体的元素
//	* p = i[0][0][0];  //错误,p未被初始化,里边存放的是垃圾值,* p指向了没有操作权限的未知区域

	printf("%c\n", p[1]);//p的值是i[0][0]的首地址,那么p[1]表示的是已确定了行列都是0的基础上,第三维的下表是1的元素,就是字母 e .
	printf("%c\n", *(i[0][0]+2));//i[0][0]+2 表示的是在已经确定是第0行第0列的基础上,再进行的操作的自然是第三维了,对地址加减运算的结果是个整数值,所以要加个取地址的逆运算符(*),最终输出是字母 l .
	printf("%s\n", i[0][0]);//此处给出的是最后一维一整维的地址指针,所以要输出 %s .
	return 0;
}
/************************************************************************/
/* 此程序在VC++6.0中的运行结果是:
e
l
hello!
Press any key to continue
                                                                     */
/************************************************************************/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值