震惊,超简单的指针数组和数组指针的区别

指针数组和数组指针的区别

先举个栗子(p)[4],p[4],(p[0]+0),(*(p+0)+0)有何区别
如果都能明白请绕道。
数组指针,指针数组不要傻傻的分不清楚。
下面是肝货。。。
在观看以下知识点之前,要掌握如下知识点:运算符的优先级和结合性、一维数组的定义和一维数组、二维数组的定义和二维数组、一维数组和指针、二维数组和指针以及基础的c语言知识。
在这里推荐大家一个c语言学习的网址,功能自己了解下,很全面。
c语言网

  1. 指针讲解
    所谓指针变量实质就是一种保存变量地址的变量。
char a;//定义一个字符型变量
char *a://定义一个字符型指针变量
int q;//定义一个整型变量
int *q;//定义一个整形指针变量
int **q;//定义一个整形的指向指针的指针变量
int k=1,*q,**w;
q=&k;// &作用为取变量的地址,指针中存放的为地址
w=&q;//w为指向指针的指针变量,顾名思义,它是用来存放指针的

可以把指针看成一种容器,容器中存放的是另一个变量的地址。
2. 指针数组和数组指针的区别
引入一道c程序片段:

int a[12],*p[3]**pp,i;
for(i=0;i<12;i++)
	  a[i]=I;
for(i=0;i<3;i++)
  p[i]=&a[i*4];
pp=p;

指针数组
回想一下指针讲解中的内容,然后理解*p[3],它是一个指针数组,可把他看成容器,p[3]这个容器由3个指针变量组成p[0],*p[2],*p[3];
将a数组分成3段,指针p[0]存放a[0]的地址, p[1]存放a[4]的地址, p[2]存放a[9]的地址;

pp为指向指针的指针变量,存放指针数组p的地址;
可以打印一下
样式一:(pp[?]+?)、((pp+?)+?)
pp[0][0]、
(pp[0]+0)、((pp+0)+0)、
pp[0][1]、(pp[0]+1)、(*(pp+0)+1)
看起来不同实质指的是同一个地址(*有规律的东东,把这三种表示形式记下来)

样式二: *pp[?] *pp[0]、*pp[1]、pp[2],等价于指针数组p[3]中3个指针变量的值,每个指针存放4个内存块,行指针

样式三:(p+?)[?] (p+1)[1]、(p+0)[2]、(p+2)[0]、**(pp+2)、pp[2][0],指向同一个地址,两个?的和为行指针的标号

以上是指针数组的三种形式,指针数组,就是由指针组成的数组,常用于一维数组分段;试着敲下理解,会发现还是很难理解,隔一天再试一次,我相信你会理解的。

附加程序代码

void main()
{
	int a[12],*p[3],**pp,i;
	for(i=0;i<12;i++)
	{	
		a[i]=i;
	}
	for(i=0;i<3;i++)
	{	
		p[i]=&a[i*4];
	}
	pp=p;
	//printf("%d ",pp[0][0]);
	//printf("%d %d\n",*pp[0],*p[0]);
	//printf("%d %d\n",*pp[1],*p[1]);
	//printf("%d %d\n",*pp[2],*p[2]);
	printf("%d ",*(p+1)[1]);
	printf("%d ",**(pp+2));
	printf("%d ",*(p+0)[2]);
	printf("%d ",*(p+2)[0]);
	printf("%d ",pp[2][0]);
	
	printf("\n");
	system("pause");
}

数组指针
int s[3][4],(*pp)[4];
pp=s;

这里要考虑优先级的,“()“优先级高,所以它是数组指针,仅仅是占一个指针变量的空间,用于指向二维数组。

与指针数组用法相同不在举例

附加程序代码

void main()
{
	int s[3][4],(*pp)[4],i,j,k=0;
	pp=s;

	for(i=0;i<3;i++)
	{	
		for(j=0;j<4;j++)
		s[i][j]=k++;
	}
	printf("%d ",pp[0][0]);
	printf("%d ",*(pp[0]+0));
	printf("%d \n",*(*(pp+0)+0));
	printf("%d ",pp[0][1]);
	printf("%d ",*(pp[0]+1));
	printf("%d ",*(*(pp+0)+1));
	/*printf("%d ",**(pp+2));
	printf("%d ",*(pp+0)[2]);
	printf("%d ",*(pp+1)[1]);
	printf("%d ",*(pp+2)[0]);*/
	system("pause");
}

总结
写了这么多,它俩的区别是啥呢?
指针数组是个容器包含多个指针变量,指向一维数组。
数组指针只是一个指针变量,占一个指针的存储空间,专用指向二维数组。

以上是个人见解,有不到位的地方,还请各位指教,在评论区留言。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值