C++继承于C,对C的语法做了一些扩展。C语言中的指针占一个机器长度(32位处理器上一个指针占32位,64位处理器上安装64位操作系统一个指针占64位),指针的作用就是使用这块内存(4字节或者8字节)去记录另外一块内存的起始位置。原理很简单,但是使用起来功能强大,有时还会使人疑惑(搞不清楚的程序员经常造成程序内存访问越界、内存泄漏等等严重的问题)。
C语言中,大概可以把指针分为两种,数据指针和函数指针。数据一般以变量的方式存在,放在堆空间或者栈空间里面。数据指针可以记录它的读取位置。函数放在代码段里面,该段用来存放编译完成的机器码,是供CPU执行的指令集,只能读不能修改,函数的入口就在该段内存中。指针可以记录函数的入口地址。由于指针记录了他们的起始地址,我们可以通过指针间接访问函数和变量,而不必使用函数原名和变量名访问,大大提高了程序的灵活性。
不同类型的指针都是用来记录内存位置的,同一台机器上指针所占内存空间都相同,所以它们可以强制转换类型,而记录的值不改变。但是访问该位置时如果心里不清楚该位置存放的是何种内容时,就会发生天灾人祸。
C++继承了C的指针。但是由于C++需要支持面向对象,指针的用法有了很多扩展,这时候,就连我都是一脸懵的。
C++中出现了引用,可以给一个变量取多个变量名,这个语法可以取代指针。但是它与指针并存。
C++中出现了类的封装。所以出现了关于类成员的指针。类里面有成员函数和成员变量,又分为静态和非静态。是不是有点怕怕的了。
对于类的静态成员,它其实与和普通的全局变量和全局函数一样,唯一的不同就是作用域变成了该类。所以只需要在它前面加个作用域就可以了。指向它们(记录它们位置)的指针和C指针的用法一样。
对于非静态数据成员,它就像C语言的结构体的成员一样,也不用紧张,用法和C的结构体成员一样。
对于非静态函数成员,C++编译器在底层做了一点点修改,就是把它的第一个参数设置为它所属的类的对象的指针,其他参数往后移一个位置。在使用该类对象调用这个成员函数时,偷偷传入了该对象的地址,该函数才能通过这个指针访问到这个对象的非静态数据成员。其他都和类的静态函数一样。在使用指向这样的函数的指针调用成员函数时,需要注意的就是多加一个类作用域,多加一个首参数(该类实例对象的首地址)。
作出了这些扩展之后,C++的指针变得稍微有一点复杂。导致很多程序员稍不注意就不会使用指针了。于是C++标准库中提供了多种语义的智能指针。它们跟语法没关系,而是在既定的语法上面定义了几种类,用来代替原生的指针。使用这些智能指针指向堆内存后,我们不在需要手动delete堆内存,智能指针在析构它们自身时会帮忙把堆内存释放避免内存泄漏。
原生指针,类成员指针,引用,标准库智能指针等等,都叫指针,因为它们的作用都是 间接访问内存中的某个位置。理解了这一点再去看清楚上述的细节。就会明了很多。
另外我自己做了一些技术收藏,都是关于C++和服务器开发,操作系统等技术的。有兴趣可以看一下,浏览器直接访问IP地址119.29.4.18