目录
举例
一、
int a;
可以看到上面声明了一个变量,自然一眼就可以看懂;那下面这个呢??
如果你被绕晕了,那我会教你一个有用的方法;按照这个方法你会读懂任何类型的声明。
第一步:找到变量名
第二步:向右看
第三步:再次往左看
第四步:如果有括号的话跳出一层括号
第五步,重复上述过程,直到读出最终的类型。以上过程同时适用于变量和函数的类型声明,
包括函数指针。学会了上面的过程,那让我们举一些具体的例子来操练一下吧
int *v[5];
每个元素都是指向int的指针或者更符号汉语习惯的v是一个有5个指向int的指针的数组,那么加上括号又是个什么意思呢??
我们要先考虑括号内的声明 所以:
V是一个指向有5个整数的数组的指针
现在让我们搞点比较复杂的东西,那就是下面这个
int (*(*v)[])();
所以v是一个int型函数指针组成的数组,看明白这个你就知道怎么回答上面这个问题了。
所以完整的说就是:v是一个指向int 型函数指针组成的数组的指针
二、
下面让我们来看看函数指针
int func();
int func()是个函数声明,func();是个返回int型的函数
那么下面这个呢?
int (*func)();
int (*func)();
所以func是个指针,指向一个返回int型的函数,这就是函数指针。
三、
最后我们聊聊const
const;
const是常量声明,意思是不能改变变量的值;const处在变量声明中不同位置的时候,效果是不一样的;很多在同学在学习的时候容易混淆
int const a;
最简单的int const a;等价于const int a;意思是a的值不能改变
加入指针的情况下会变得稍微复杂一点。
所以r是一个指向const int的指针,*r不能改变;但是r本身不是const,所以可以改变。
const int a;
不能够改变的int型变量
int const*r;
你可以直接给r赋值,让它指向别的地方。
int *const r;
我们把const和*的位置互换一下,效果就又不一样了。
指向int 意味着r的值本身不能够改变,同时也不能给r进行赋值;但是int没有const修饰
所以*r是可以改变的
四、一个指针的大小是多少?(补充)
对于现在学c/c++的新人,经常碰到一个简单但容易犯错的问题
指针的大小是多少??
不如换种说;一个指针在内存里面占多少个字节??
举个例子 我们现在有三个指针,分别指向一个char 和double还有一个struct;这个struct里面还有一个char和一个长度为100的float的数组。
那么请问这三个指针的大小是多少??
有些同学可能认为指针跟指向类型的大小是一样的,比如char指针和char一样是一个字节;double指针和double类型一样占8个字节;上面的struct占401个字节,那么指向它的指针也占401个字节,然而这只是一个错误的经典理解。其实不论在什么样的机器上,在同一个机器中。不管指向什么,指针的大小都是固定的,都是跟内存的地址一样长。为了去理解这个问题,我们需要知道
指针是什么?? 指针的本质就是内存的地址,所以一个内存地址有多长,一个指针就有多大
这就是我们经常听到的两个概念;32bit架构和64bit架构,这是什么意思呢??
计算机的内存是一块一块连续的区块,每个区块可以存放 1byte的的信息;
这些区块就像一些房子,我们可以给他们依次编号,这里需要注意的是,现在计算机内存的最小单位是一个字节而不是一个比特;1个字节等于8个比特
那么给第一个地址编号0001,第二块编号0002;以此类推
给第9999块编号9999,假如我们只用四位数记录地址;那么我们只能有9999块内存,换算成二进制,在32bit的机器中;我们使用32个比特来记录一块内存的地址;
在64bit的机器中,我们使用64bit来记录一块内存的地址;因此32bit内存地址编号的最大值就是32bit的上限,也就是2的32次方;这个容量换算成我们熟悉的单位就是4GB;64bit的机器的内存地址编号的最大值也就是2的64次方;一共是17179869184G的内存。
考虑到现在的主流配置还是16GB,64bit的架构应该在很长一段时间都不会过时了;不会产生向新的向128bit升级的需求
既然指针存储的是内存的地址,而内存的地址在32位架构上是4个字节;那么32位架构的指针就是4个字节。同理64bit架构的指针就是8个字节。
实际情况中,可执行程序是由编译器产生的二进制码,
因此指针的大小实际上是由编译器决定的。
到这里就全部讲完了。
完结撒花!!🎇🎇🎇