C++中指针的概念和声明
学习 C++ 的指针既简单又有趣。通过指针,可以简化一些 C++ 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。所以,想要成为一名优秀的 C++ 程序员,学习指针是很有必要的。
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。
指针是存储内存地址的变量。就像 int 变量用于存储整数值一样,指针变量用于存储内存地址,如:
因此,指针是一个变量,与所有变量一样,指针也占用内存空间(在图 8.1 中,其地址为 0x101)。指针的特殊之处在于,指针包含的值(这里为 0x558)被解读为内存地址,因此指针是一种指向内存单元的特殊变量。
注意:
内存单元地址通常使用十六进制表示法。十六进制是一种位权为 16 的幂的数字表示法,即使用 16 个不同的符号( 0-9 和 A-F)来表示数字。显示十六进制数时,通常使用前缀 0x。因此, 0xA 是十进制数 10 的十六进制表示, 0xF 是十进制数 15 的十六进制表示,而 0x10 是十进制数 16 的十六进制表示。
作为一种变量,指针也需要声明。通常将指针声明为指向特定的类型,如 int,这意味着指针包含的地址对应的内存单元存储了一个整数。 也可将指针声明为指向一个内存块, 这种指针被称为 void 指针。
作为一种变量,指针与所有变量一样,也需要声明:
PointedType * PointerVariableName;
在这里,PointedType 是指针的基类型,它必须是一个有效的 C++ 数据类型,PointerVariableName 是指针变量的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。但是,在这个语句中,星号是用来指定一个变量是指针。以下是有效的指针声明:
int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */
所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。
与大多数变量一样,除非对指针进行初始化,否则它包含的值将是随机的。您不希望访问随机的内存地址,因此将指针初始化为 NULL。 NULL 是一个可以检查的值,且不会是内存地址:
PointedType * PointerVariableName = NULL; // initializing value
因此,声明 int 指针的代码如下:
int *pointsToInt = NULL;
注意:
与您学过的所有数据类型一样,除非对指针进行初始化,否则它包含的将是垃圾值。对指针来说,这种垃圾值非常危险,因为指针包含的值被视为地址。未初始化的指针可能导致程序访问非法内存单元,进而导致程序崩溃。
该文章会更新,欢迎大家批评指正。
推荐一个零声学院的C++服务器开发课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容
点击立即学习:C/C++后台高级服务器课程