关于C++的 []、*、&,数组指针引用 之 声明

恩,我原来是一直一直搞不明白这个声明怎么读,还有函数传值。就是死都搞不明白。然后最近终于对声明大彻大悟了。

两种类型:

//第一种
int n=0;
char c='k';

//第二种
int *p=&n;
char s[4]="c++";
char &cc=c;

下面说的“存储”请不要当成是 存储到内存,这里的“存储”就是理解时候用的自然语言(不是术语),没有任何科学依据(我不懂汇编……也不懂编译原理……所以不能保证是不是真的是这样)。

下面请区别“数据”与“值”这两个词。至于怎么区别,emmm,我也不清楚,大概这么理解吧:一个名字存储的“数据”就是你要给别人说清楚这个名字代表了什么的时候,要说的所有的信息。一个名字的“值”就是你单独用这个名字的时候(不加任何运算符(包括*(间接寻址运算符),&(取址运算符))之类的运算符),这个名字代表了(返回了)什么(好吧,引用就单算吧,就当是什么都没有吧。就是引用没有值。主要是我原来一直以为指针只是存储了地址,以至于我一直觉得在声明指针的时候完全没必要加int啥的(好吧其实我现在也这么觉得……))。

第一种名字(上面的n,c)他们存储的数据,只与值相关,就是这个值不会牵扯到其他的东西了(区别于第二种,这里可能还不知道我要表达什么,请与第二种作对比)。int 就是一个数,char就是一个字符。所以声明的时候只要

第二种名字(上面的p,s,cc)他们存储的数据(这个数据实际上是地址),不止与值相关,或者说这个数据由两部分构成,一部分是值(地址);由于这个值本身就与其他东西相关(地址里一般总是存储了一些东西的,别太较真,主要是感性的理解),另一部分,就是这个其他东西的信息(就是类型)了。

嵌套:

在声明第一种名字的时候没啥问题,……这……没啥问题吧,就是声明一下类型就可以了,这个很直观吧……

在声明第二种名字的时候问题就来了,这个第二种名字由于可以存储(或者指向)别的东西,所以需要声明两个类型,一个是值的类型(指针,还是数组,还是引用),一个是存储的东西的类型。而这个存储的东西还可以是第二种类型的(除了引用,因为引用),就又需要声明箱子里的箱子里装的是什么(或者 指向的值 指向了什么)。这样就形成了一个嵌套,类似一条链子,我们要一层一层的声明都是啥,直到最后存储(指向)了一个第一种类型,就停下了。

阅读顺序:

1.括号,括号里面的顺序同这个顺序(名字一定会在括号里。这句话看不懂可以不管,按照感觉来就行,顺序四会用到这个性质) 2.先后缀(数组)再前缀 (指针、引用)3.从内到外(即后缀是从左到右,前缀是从右到左)。

下面的【】代表了注释,等同于上面的()。

啥意思嘞。(这里可以跳过,先看例子,再来看这里)按照这个顺序就可以得到一个序列:

(指针,数组,数组,指针,...,指针,int)

将第一个,和后面所有的划分一下,变成一个只有两个类型的序列:

(指针,类型(也是一个序列))【就是:(指针,(数组,数组,指针,...,指针,int))】

第一个就是值的类型,第二个就是存储的东西的类型。


下面是一个例子:int **(**b[3][2])[4];

01 int **(**b[3][2])[4]; 先看括号。

02 int **(**b[3][2])[4]; 括号里顺序不变,如果还有括号,就还要看括号。这里没有括号了,就进入第二步,先是:后缀。

03 int **(**b[3][2])[4]; 从内到外,最挨着b的。b是:装着3个东西的数组。这3个东西是什么类型呢?接着看。

04 int **(**b[3][2])[4]; 从内到外,次挨着b的。这3个东西每个都是:装着2个东西的数组。这2个东西是什么呢?接着看。

05 int **(**b[3][2])[4]; 从内到外,碰到括号了……说明后缀完了,那就退回第二步,下一个是:前缀。

06 int **(**b[3][2])[4]; 从内带外,指针,这2个东西都是:指针。指向什么类型的东西呢?

07 int **(**b[3][2])[4]; 从内带外,指针,每个指针都指向:指针。这个指针指向什么类型的东西呢?

08 int **(**b[3][2])[4]; 从内到外,又碰到括号了,说明前缀完了,退回第二步,没有下一个了(前缀后缀都完了),退回第一步,看括号外面。

09 int **(**b[3][2])[4]; 第二步,先看后缀。

10 int **(**b[3][2])[4]; 从内到外,最挨着括号的。刚刚(第07步)说到了指针,这个指针指向的是:存了4个东西的数组。这4个东西是什么呢?

11 我懒得写了,下面就是该前缀了(两次指针),最后指向了int,就完了。

总结一下就是:b是一个:装了3个 有2个 指向了 指向 装了4个 指向了 指向int的指针 的指针 的数组 的指针 的指针 的数组 的数组。好,这句话根本让人看不懂。所以请这么理解:

b是一个装了3个元素的数组,这些元素都是数组,装了2个指向了指针的指针,指向的那些指针,又都指向了装了四个元素的数组,这些元素是指针,指向了一个指向int的指针。好吧这依然让人无法理解,所以……只可以意会不能言传…………。








猜你喜欢

转载自blog.csdn.net/YYMHQE123/article/details/80944779