一次性看懂 C/C++ 当中的声明规则 与 const

Posted 想文艺一点的程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一次性看懂 C/C++ 当中的声明规则 与 const相关的知识,希望对你有一定的参考价值。

学习来源:B站 HexUp,初中生也能看懂的C/C++类型声明规则教学,很简单的!。

目录

你懂下面这个声明吗?不懂的话,请看接下来的黄金法则,

1、五步法:

第一步:找到变量名,如果没有变量名,找到最里面的结构

第二步:向右看,读出你看到的东西,但是不要跳过括号

第三步:向左看,读出你看到的东西,但是不要跳过括号

第四步:如果有括号,则跳出一层括号。

第五步:重复上述类型,直到读出最终的类型。

2、栗子:

2.1 非函数的声明


第一个:

int v[5];

(1)v:就是变量名
(2)v[5] :说明这是一个数组,里面有五个元素。
(3)int :代表数组当中的每一个元素都是 int 类型。


第二个:

int *v[5];

(1)v:就是变量名
(2)v[5] :说明这是一个数组,里面有五个元素。
(3)int * :代表每个元素都是一个指针,指向 int 类型的变量。


第三个:

int (*v)[5];

(1)v:就是变量名
(2)(*v) :括号不能跳过,在此处说明,v 是一个指针
(3)(*v)[5] : 向右看,v 指向了一个数组,类型为:内部有5个元素的数组。
(4)int : 里面的 5 个元素的类型为int类型。


第四个:

int * (*v)[5];

(1)v:就是变量名
(2)(*v) :括号不能跳过,在此处说明,v 是一个指针
(3)(*v)[5] : 向右看,v 指向了一个数组,类型为:内部有5个元素的数组。
(4)int * : 里面的 5 个元素的类型为:int * 类型的指针


2.1 函数指针分析

第一个:

int (*func)();

(1)func:就是变量名
(2)(*func) :括号不能跳过,在此处说明,func 是一个指针
(3)(*func)() : 向右看,func 这个指针指向了一个函数,并且这个函数类型没有形参。
(4)int : 这个函数的返回值为 int 类型。


第二个:

int (*v[])();

(1)v:就是变量名
(2)v[] :向右看,v 是一个数组。
(3)*v[] : 向左看,v这个数组当中,每一个元素都是指针。
(4)() :跳出括号向右看,代表这些指针指向一个形参为空的函数。
(5)int :向左看,代表这些指针指向一个返回值为 int 的函数。


最后一个:

int (*(*v)[])();

(1)v:就是变量名
(2)*v :括号不能跳过,v 是一个指针。
(3)(*v)[] : 向右看,v是一个指针,指向一个数组。
(4)* (*v)[] :向左看,这个数组里面又都是指针
(5)() :向右看,这里面的指针又全部指向一个形参为空的函数。
(6)int :向左看,代表这些指针指向一个返回值为 int 的函数。


3、const 的分辨

const 是一个常量声明,没有指针的时候还比较简单:

int const a; <======> const int a;

加入指针之后,继续使用 5 步法:

int const *r;

(1)r :找到变量。
(2)右边没有东西。
(3)*r:向左看,代表他是一个指针。
(4)*int const:再向左看,可以看到它指向的是一个 int const 类型的数据。

总结:也就是说 r 指向的变量,他自己的内容不能发生改变,反而指针的指向是可以发生改变的。


int * const r;

(1)r :找到变量。
(2)右边没有东西。
(3)*const:向左看,代表这个变量 r 他是不能变的。
(4)* const :再向左看,所以 r 是一个 const 的一个指针。
(5)* int :再向左看,其指向的是一个 int 类型数据。

总结:r 自己本身的指向是不能发生改变的,反而指向的变量的内容是可以发生改变的。

以上是关于一次性看懂 C/C++ 当中的声明规则 与 const的主要内容,如果未能解决你的问题,请参考以下文章

一次性看懂 C/C++ 当中的声明规则 与 const

C/c++中 数组全局变量的定义声明 与 引用声明

第一次网上笔试总结

转自简书:关于FOUNDATION_EXTERNexternFOUNDATION_EXPORTextern "C"的区别

看懂UML视图中的各种关系

Drools 函数学习