指针数组和数组指针

1. 指针数组和数组指针

  1. 指针数组是一个数组,装着指针的数组 int *p[2]
  2. 数组指针是指针,指向数组的指针 int (*p)[2]

2. 优先级: ()>[]>*

  1. (*p)[n]: 先看括号内,p是一个指针,这个指针指向一个一维数组数组长度为n,这是数组的指针,即数组指针
  2. p[n] : 根据优先级,先看[],则p是一个数组,再结合,这个数组的元素是指针类型,共n个元素,即指针数组

3. 一个非常好的例子:

3.1 一维数组

void test()
{
	int a[5]={1,2,3,4,5};
	int (*p)[5]; //数组指针,数组里面有5个元素
	p=&a; //数组a的地址赋值给p,则p为a数组的地址,则*p表示数组a本身
	
	//%p输出地址
	//在c中,数组名的值是个指针常量,也是数组第一个元素的地址,
	//它的类型取决于数组元素的类型
	
	printf("%p\n",a); //输出数组名,一般用数组的首元素地址来标示一个数组,
									//输出数组首元素的地址
	printf("%p\n",p); //p为数组a的地址,输出数组a的地址
	printf("%p\n",*p); //*p标示数组a本身,用首元素标示一个数组
	printf("%p\n",&a[0]);
	printf("%p\n",p[0]);//数组首元素的地址
	printf("%d\n",**p);//*p为数组本身,即数组a首元素地址,则**p为其值
	printf("%d\n",*p[0]);//根据优先级,p[0]标示首元素地址,*(p[0])标示首元素本身
	printf("%d\n",*p[1]);//为一个绝对值很大的负数
}

结果:	
0x7fff4f4b69d0
0x7fff4f4b69d0
0x7fff4f4b69d0
0x7fff4f4b69d0
0x7fff4f4b69d0
1
1
32767

3.2 二维数组

void test()
{
	//二维数组
	int a[2][3]={{0,1,2},{3,4,5}}; //两行三列
	int (*p)[3];//p是数组指针,指向含有三个元素的一维数组
	int *q[2];//指针数组,一个数组内存放两个指针变量
	
	p=a;
	q[0]=a[0];
	q[1]=a[1];
	
	printf("%d\n",a[1][2]);//5
	printf("%d\n",*(p[1]+2));//5
	printf("%d\n",*(*(p+1)+2));//5
	printf("%d\n",(*(p+1))[2]);//5
	printf("%d\n",p[1][2]);//5
	
	printf("%d\n",*(q[1]+2));//5
	printf("%d\n",*(*(q+1)+2));//5
	printf("%d\n",(*(q+1))[2]);//5
	printf("%d\n",q[1][2]);//5
}

参考

https://blog.csdn.net/u013719339/article/details/80563247

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值