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. Learning-Python【5】:Python数据类型(1)—— 整型、浮点型、字符串

    一.整型 1.用途:记录年龄.等级.各种号码等 2.定义方式 age = 22 只能将纯数字的字符串转换成整型 3.常用操作+内置方法 赋值运算.比较运算.算数运算 该类型总结: 存一个值 不可变(可 ...

  2. 由 UWP 版网易云音乐闪退引发的博文

    今天,不知怎么的.网易云音乐出现了一打开就闪退的情况.百度了好些时候未果,就直接 Windows + i 打开 Windows 设置 > 应用 在应用和功能列表中找到网易云音乐,在展开的 高级选 ...

  3. win平台下Path变量消失问题

    解决方法:2019.01.10文章转载自 李北北:https://www.jianshu.com/p/b89f0c99867e 问题描述:修改了path变量,但是环境变量中path消失,于是想再次打开 ...

  4. js日期的格式化

    我们看控制台打印的关于Date这个类 我们这里可以看到内置方法没有类似format这种方法,所以需要自己定义. 内置的方法: var myDate = new Date();myDate.getYea ...

  5. 关于ExpressionChangedAfterItHasBeenCheckedError

    最近在stackoverflow上似乎每天都有一些关于angular报错‘ExpressionChangedAfterItHasBeenCheckedError’的问题.发生这些问题通常是由于angu ...

  6. HBase过滤器的使用

    一.常用过滤器: 1.数据准备: Rowkey:001 Family:Quilfifier address value: 昆明市西山区 Rowkey:001 Family:Quilfifier age ...

  7. JavaScript基础知识点总结

    JavaScript----js 全栈课程-------全栈工程师 前端:信息展示,普通用户浏览---前端工程师(html+css:静态页面 js:页面的交互效果) 后台:信息管理,管理员,数据库-- ...

  8. JAVA的原子性和可见性,线程同步的理解

    1.原子性 (1)原子是构成物质的基本单位(当然电子等暂且不论),所以原子的意思代表着——“不可分”: (2)原子性是拒绝多线程操作的,不论是多核还是单核,具有原子性的量,同一时刻只能有一个线程来对它 ...

  9. Linux下一个进程可以开多少线程

    这个问题,整理了一下网上的资料,结果如下: 一.ulimit -n可以查看一个进程最多可以打开多少文件描述符数: 二.一个进程最多可以产生多少线程,可用如下的方法: 32位linux系统最大内存地址4 ...

  10. 34 char类型转换为int类型

    #include<iostream> #include<cstdlib > using namespace std; int main() { char a=101; int ...