摘要:简称指针数组,是数组,因为没有发生变化。就是这个指针,指向了,因为所以没有被吸附到成为,而是留给了,让成为了一个指针,脱离了数组名这个地址常量的范畴,也就是指向了一个个元素的整型数组的指针,简称数组指针。
这篇文章仅限于有指针基础,并且大概了解这些概念,只是不通透的群体
首先了解一个概念:
类型名,显而易见,类型名就是变量的名字,这里提前进行说明,数组名不是变量,也不是指针,而是地址常量,这是使用的时候系统会将其退化成指针。为了方便理解和统一,我们在本篇文章里面将数组名当做类型名类似物,但是切记。数组名不是类型名!然后,去掉变量的名字就是类型名!我已经解释过了把数组名当做类型名类似的东西了。
这里我们列举一些类型名:
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现在是指针类型。
接下来上图:
现在看我如何利用这一套理论秒杀!
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])的情况,也就是括号里面就一个*,代表它是一个指针,就可以了。其实也不会遇到这么复杂的。
下一篇文章继续深入探究,带你走进不一样的视角。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/124508.html
摘要:在位机器上,如果有个地址线,那一个指针变量的大小是个字节,才能存放一个地址。就是一个指针变量,也有自己的类型,指针变量的类型我们可以发现指针的定义方式是类型星号。也就是说存储什么变量类型就用什么指针变量类型。 ...
摘要:需要注意的是用矩阵形式如行列表示二维数组,是逻辑上的概念,能形象地表示出行列关系。再次强调二维数组名如是指向行的。一维数组名如是指向列元素的。 哈喽!这里是一只派大鑫,不是派大星。本着基础不牢,地动山摇的学习态度,从基础的C语言语法讲到算法再到更高级的语法及框架的学习。更好地让同样热爱编...
目录 前言 一、 什么是指针? 引例 计算机是怎么对内存单元编号的呢? 内存空间的地址如何得到 想存地址怎么办? 本质目的不是为了存地址 二、指针和指针类型 为什么有不同类型的指针 1.指针的解引用 2.指针+-整数 三、野指针 造成野指针的原因 1.未主动初始化指针 2.指针越界访问 3.指针指向的空间释放 规避野指针 四、指针运算 1.指针+-整数 2.指针-指针 3.指针的关系运...
摘要:如果我们要将的地址保存到中,我们需要我们给指针变量相应的类型。类型的指针是为了存放类型变量的地址这里可以看到,指针的定义方式是类型名指针变量名。如下最后本文介绍的是指针的基础知识,往后还会继续深入讲解指 ...
摘要:所以是数组指针,而是指针数组。因为对一个二维数组,可以不知道有多少行,但是必须知道一行多少元素。当二维数组数组名传参,形参接收时,数组的行可以省略,列不能省略,如果省略了列,我们就无法知道当指针加减跳过几个字节。 ...
阅读 662·2023-04-26 02:03
阅读 1036·2021-11-23 09:51
阅读 1109·2021-10-14 09:42
阅读 1737·2021-09-13 10:23
阅读 926·2021-08-27 13:12
阅读 838·2019-08-30 11:21
阅读 1000·2019-08-30 11:14
阅读 1041·2019-08-30 11:09