深入理解数组指针与指针数组,基于Dev C++测试

深入理解数组指针与指针数组,基于Dev C++测试

数组指针与指针数组

指出:[ ]的优先级比*高,两种区别在于先形成数组还是先形成指针,先形成数组为指针数组。

数组指针(行指针)

(占有内存中一个指针的存储空间,数组名的指针,即数组首元素地址的指针,本质是指针)
定义:int (*p)[10]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。
如要将二维数组赋给一指针,应这样赋值:
int a[3][4];
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]

指针数组

(占有多个指针的存储空间,本质是元素为指针的数组)
定义:int *p[n], 是具有n个指针类型的元素的数组,p[0]、p[1]、p[2]代表存放变量的地址(指针变量),需要分别赋值。将二维数组赋值给指针数组:for(i=0;i<3;i++) p[i]=arr[i];

注意:32位系统下,任何类型的指针都是占4个字节

测试

#include <stdio.h>
#include <stdlib.h>

int main()
{
	unsigned char i=0,j=0;
	char array[3][3] = {{11,22,33},{44,55,66},{77,88,99}};
	char *p[3] = {array[0],array[1],array[2]};     //定义指针数组    p:数组名/第一个指针首地址     *p:第一个指针     **p:第一个指针指向的元素,即11 
	char (*pp)[3] = array;						   //定义数组指针    pp:行指针   *pp:经测试仍为指针    **pp:指向行的首元素 

	//测试指针数组 
	printf("%d\n",array[i][j]);   // = 11 
	printf("%d\n",**p);		  	  // = 11
	printf("\n");
	printf("%d\n",*(*p+1));       // = 22
	printf("%d\n",*(p[0]+1)); 	  // = 22
	printf("%d\n",*(p[0])+1);	  // = 12         //+1没有包含在括号内, 没有起到选择的效果 
	printf("\n");
	printf("%d\n",**(p+1));       // = 44 
	printf("%d\n",**(array+1));   // = 44
	printf("%d\n",*p[1]);         // = 44 
	printf("%d\n",array[1][0]);   // = 44
	printf("\n");
	printf("%d\n",*((*p+2)+2));    // = 55        //注意不要与数组指针混淆,指针数组的每个元素本质是ElemType型的指针,++每次移动sizeof(ElemType)长度 
	printf("%d\n",*((*p+3)+2));    // = 66
	printf("%d\n",*((*p+2)+3));    // = 66
	printf("%d\n",*(*p+5));        // = 66    
	printf("%d\n",(*p+2)[3]);      // = 66   
	printf("%d\n",(*p+3)[2]);      // = 66
	printf("%d\n",(*p)[5]);        // = 66        // 
	printf("%d\n",*(*p+5));		   // = 66
	printf("\n");
	printf("%d\n",p[2][2]);        // = 99
	printf("%d\n",*(*(p+2)+2));	   // = 99
 	printf("\n");
	//测试数组指针
	printf("\n");
	printf("%d\n",**pp);           // = 11
	printf("%d\n",**(pp+1));       // = 44
	printf("%d\n",*(*pp+1));       // = 22
	printf("%d\n",*pp);            // = 6487552  为地址 
	printf("%d\n",pp);             // = 6487552  为地址 
	
	 
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值