• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

一招秒杀指针问题(指针数组,数组指针,n维指针,以及什么时候使用他们)

互联网 diligentman 2天前 5次浏览

这篇文章仅限于有指针基础,并且大概了解这些概念,只是不通透的群体

首先了解一个概念:

类型名,显而易见,类型名就是变量的名字,这里提前进行说明,数组名不是变量,也不是指针,而是地址常量,这是使用的时候系统会将其退化成指针。为了方便理解和统一,我们在本篇文章里面将数组名当做类型名类似物,但是切记。数组名不是类型名!然后,去掉变量的名字就是类型名!我已经解释过了把数组名当做类型名类似的东西了。

这里我们列举一些类型名:

int a;——— int是变量a的类型名

int a[10];————int是数组a每个元素的类型,此时这个int不是类型名,是每个元素的类型那么int [10]是数组a的类型(我们可以这样来看,尽管在各种书上没有这样讲的,但是这样确实可以方便我们的理解)

int* a————int*是a的类型,其中我们细分一下*在定义的时候代表是指针,而int代表的是指针指向的是int类型的数据哦。那么int*就是指向int类型的指针。

我们写的是int* a,不是int *a,虽然两者是无所谓的,但是我会在后面讲解我的理解,这里请记住这个*是紧跟在int后面,这样会极大的便利我们的理解

int* a[3]————-这里的意思是数组a每一个元素的类型是int*,就像我上一个写的int'* a是一个道理。,那么此时类似我们写的int a[10],这个类型名int* [10]的意思就是包含10个int*类型的数组。是整个数组的类姓名,不是数组每个元素的类型名。简称指针数组,是数组,因为a没有发生变化。

int (*)a[10]————到这里我们就要进行深入了解了,紫色字体表示是插曲,看完插曲其他的内容连着上面说的来

查看优先级可以得到[]的优先级比*更高,所以导致int* a[10]和int (*a)[10]是不同的,由于[]优先级比*高,所以a[10]是首先得到的,也就是先得到了一个数组,然后类型是int*,存放指针的数组,简称指针数组。那么打()就可以避免先结合的问题,直接表明了a是一个指针名,不是数组名了,也可以这么说,你的*要打在int的紧跟着的后面是为了强调*会被吸到int这边,形成int*类型,(但其实是无所谓的!这么打都可以)如果被int吸附成int*,就代表这个变量里面存放的是int*,不然就还是int。而类型是int*类型的变量就是指针变量。我知道这里有的人会有争议,有的人会说没有这种说法,不严谨,但是我们只是为了应用,便于理解,所以这里就不争端这个问题了。打上括号有2个原因:1.不被int吸附形成int*类型  2.不被a吸附直接形成数组。好了接下来回到上面的,回到黑体字部分。

int(*a)[10]就是a这个指针,指向了int [10],因为()所以*没有被吸附到int成为int*,而是留给了a,让a成为了一个指针,脱离了数组名这个地址常量的范畴,int(*)[10]也就是指向了一个10个元素的整型数组的指针,简称数组指针。是指针。因为a发生变化了,我们可以看到(*a),a现在是指针类型。

接下来上图:

一招秒杀指针问题(指针数组,数组指针,n维指针,以及什么时候使用他们)

 现在看我如何利用这一套理论秒杀!

int*(*a)[10]—第一部,去掉“变量名”,得到类型名,int*(*)[10],第二部:有一个*被吸附到int了,所以每一个变量里存放的是int*,然后再看,[10]说明有10个int*,再看(*),这是一个指针了,()让其没有被任何人吸附,再联系上面讲述的几种基本的名称,这个指针指向了一个存放了10个int*的数组。

int** (*a)[10],一样的,指针指向了一个存放了10个int**的数组。那么我们成功引出了二维指针的引子。

所以我们要补充以上的理论了,之前说没有括号*就会被吸附到int成为int*,没有括号,a[10]的a是地址常量,有括号int (*a)[10],不仅防止了int*,也让a没有和数组结合,而是被*形成了指针,形成了数组指针。(数组指针就是指向数组的指针)。所以这个括号“防”了两边。

但是如果有两颗**,那么只有前面的一颗会被吸附,剩下一颗让a变成指针变量。int* *a,我中间空格了,int*是变量存的类型,如果加上[10]的话只不过是这个存放类型的堆叠而已。但是没有[10]就是每个变量存储的类型,加上[10]才是变量名哦。

指针的维数看*的个数,假设n维指针,那么前n-1个被int吸附,剩下一个被a吸附,形成指针,也就是a这个指针里面存放是int***(n-1个*),然后这int***(n-1个*)就是指它存放了一个指针的地址的地址的地址(n-1个的地址)。

int******(*a[10])[100]:第一部:去掉“变量名(再次提醒我们这里的变量名是变量名类似的东西,说明白了就是把数组名当初变量名,但它不是)”得到int******(*[10])[100],每个元素存放了int******,加上[10]就是变量的堆叠,也就是存放了100个int******的数组。括号里面是*[10],没有(),所以被数组吸附了,是指针数组,代表这个数组存放了10个指针类型(把括号当初一个整体,再一层一层看),而这个类型是int******[100],也就是一个有10个元素的指针数组,每个元素都指向了一个存放了100个int******的数组指针。

看到*a[]想到指针数组

看到(*a)[]想到数组指针

int******(**a[10])[100],这个写法明显错啦,我们说过n维指针前面n-1个*会被吸附到int,所以必定不会出现(**a[10])的情况,也就是括号里面就一个*,代表它是一个指针,就可以了。其实也不会遇到这么复杂的。

下一篇文章继续深入探究,带你走进不一样的视角。


喜欢 (0)