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

关于C++指针的更多相关文章

  1. TODO:Golang指针使用注意事项

    TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...

  2. enote笔记法使用范例(2)——指针(1)智能指针

    要知道什么是智能指针,首先了解什么称为 “资源分配即初始化” what RAII:RAII—Resource Acquisition Is Initialization,即“资源分配即初始化” 在&l ...

  3. C++虚函数和函数指针一起使用

    C++虚函数和函数指针一起使用,写起来有点麻烦. 下面贴出一份示例代码,可作参考.(需要支持C++11编译) #include <stdio.h> #include <list> ...

  4. C++11 shared_ptr 智能指针 的使用,避免内存泄露

    多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...

  5. c 数组与指针的使用注意事项

    数组变量和指针变量有一点小小的区别 所以把数组指针赋值给指针变量的时候千万要小心 加入把数组赋值给指针变量,指针变量只会包含数组的地址信息 而对数组的长度一无所知 相当于指针丢失了一部分信息,我们把这 ...

  6. Marshal.Copy将指针拷贝给数组

    lpStatuss是一个UNITSTATUS*的指针类型实例,并包含SensorDust字段 //定义一个数组类型 byte[] SensorDust = new byte[30] //将指针类型拷贝 ...

  7. C++智能指针

    引用计数技术及智能指针的简单实现 基础对象类 class Point { public: Point(int xVal = 0, int yVal = 0) : x(xVal), y(yVal) { ...

  8. EC笔记:第三部分:17、使用独立的语句将newed对象放入智能指针

    一般的智能指针都是通过一个普通指针来初始化,所以很容易写出以下的代码: #include <iostream> using namespace std; int func1(){ //返回 ...

  9. 智能指针shared_ptr的用法

    为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer). 智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈 ...

  10. 智能指针unique_ptr的用法

    unique_ptr是独占型的智能指针,它不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr,如下面错误用法: std::unique_pt ...

随机推荐

  1. Selenium3.6.0+Firefox55+JDK8.0配置

    一.安装JDK8.0(自行百度安装步骤) 二.在eclipse的偏好设置中选择java版本为8.0 三.Maven配置 <project xmlns="http://maven.apa ...

  2. 力扣(LeetCode)482. 密钥格式化

    给定一个密钥字符串S,只包含字母,数字以及 '-'(破折号).N 个 '-' 将字符串分成了 N+1 组.给定一个数字 K,重新格式化字符串,除了第一个分组以外,每个分组要包含 K 个字##符,第一个 ...

  3. Introducing the Microservices Reference Architecture from NGINX

    Introducing the Microservices Reference Architecture from NGINX https://www.nginx.com/blog/introduci ...

  4. Luffy之结算订单页面(订单模型表的创建,订单的生成,以及订单详情展示等)

    订单页面 在前面我们已经构建了,购物车的页面,接下来到了结算页面 1.首先,在购物车页面点击去结算按钮时,我们需要做如下动作 .前端发送生成订单的请求,点击标签内触发事件 create_order t ...

  5. 『TensorFlow』线程控制器类&变量作用域

    线程控制器类 线程控制器原理: 监视tensorflow所有后台线程,有异常出现(主要是越界,资源循环完了)时,其should_stop方法就会返回True,而它的request_stop方法则用于要 ...

  6. localStorage、sessionStorage用法以及区别

    设置: sessionStorage.setItem("key", "value");localStorage.setItem("site" ...

  7. 如何seo(搜索引擎优化)

    Seo是指遵循搜索引擎的搜索原则,对网站结构.网页文字语言和站点间互动外交等进行合理规划部署,以改善网站在搜索引擎的搜索表现,从而增加客户发现并访问网站的可能性的一个过程.

  8. day19_python_1124

    .01 昨日内容回顾 面向对象:1,将一些相似功能的函数集合到一起 类:具有相同属性和功能的一类事物. 对象:类的具体体现. 2,站在上帝的角度考虑问题,类就是一个公共模板, 类的结构: class ...

  9. Charles设置HTTPS抓包

    1. 配置 Charles 根证书 点击 Help -> SSL Proxying -> Install Charles Root Certificate 之后会弹出钥匙串,如果不弹出,请 ...

  10. Homework 2.0

    一.第一题,要求是输入不同的字符的时候输出不同的结果,这道题主要是运用输入和输出语言还有判断语句,分别使用switch和if else来进行输入字符的判断,本体比较简单,注意定义输入变量的类型为cha ...