关于C++指针
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++指针的更多相关文章
- TODO:Golang指针使用注意事项
TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...
- enote笔记法使用范例(2)——指针(1)智能指针
要知道什么是智能指针,首先了解什么称为 “资源分配即初始化” what RAII:RAII—Resource Acquisition Is Initialization,即“资源分配即初始化” 在&l ...
- C++虚函数和函数指针一起使用
C++虚函数和函数指针一起使用,写起来有点麻烦. 下面贴出一份示例代码,可作参考.(需要支持C++11编译) #include <stdio.h> #include <list> ...
- C++11 shared_ptr 智能指针 的使用,避免内存泄露
多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...
- c 数组与指针的使用注意事项
数组变量和指针变量有一点小小的区别 所以把数组指针赋值给指针变量的时候千万要小心 加入把数组赋值给指针变量,指针变量只会包含数组的地址信息 而对数组的长度一无所知 相当于指针丢失了一部分信息,我们把这 ...
- Marshal.Copy将指针拷贝给数组
lpStatuss是一个UNITSTATUS*的指针类型实例,并包含SensorDust字段 //定义一个数组类型 byte[] SensorDust = new byte[30] //将指针类型拷贝 ...
- C++智能指针
引用计数技术及智能指针的简单实现 基础对象类 class Point { public: Point(int xVal = 0, int yVal = 0) : x(xVal), y(yVal) { ...
- EC笔记:第三部分:17、使用独立的语句将newed对象放入智能指针
一般的智能指针都是通过一个普通指针来初始化,所以很容易写出以下的代码: #include <iostream> using namespace std; int func1(){ //返回 ...
- 智能指针shared_ptr的用法
为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer). 智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈 ...
- 智能指针unique_ptr的用法
unique_ptr是独占型的智能指针,它不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr,如下面错误用法: std::unique_pt ...
随机推荐
- Ubuntu 14.04 下安装 OpenCV
参考: Installation in Linux Error compiling OpenCV, fatal error: stdlib.h: No such file or directory 图 ...
- 不错的redis文章
参考: https://www.cnblogs.com/itdragon/tag/redis/
- Jade入门学习笔记
jade是超高性能的node JavaScript模板引擎,有着非常强大的API和大量杰出的特性.它主要针对node的服务端.由于商标的原因,改为Pug,哈巴狗.Pug有它本身的缺点--可移植性差,调 ...
- 三 drf 认证,权限,限流,过滤,排序,分页,异常处理,接口文档,集xadmin的使用
因为接下来的功能中需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员. python manage.py createsuperuser 创建管理员以后,访问admin站点 ...
- C语言获取Linux系统精确时间
gettimeofday()函数的使用方法 1.函数原型 #include <sys/time.h> int gettimeofday(struct timeval *tv, struct ...
- linux grep find查找文件夹、代码中的某行/字符串
本文转载于:https://blog.csdn.net/Mr_Cat123/article/details/80541658 在Linux中,由于文件很多,代码很长,可能我们只知道其中的一两个字符串, ...
- vue的.vue文件是怎么run起来的(vue-loader)
vue的.vue文件是怎么run起来的(vue-loader) 引子:vue的.vue文件是怎么跑起来的? 答:通过vue-loader,解析.vue文件,在webpack解析,拆解vue组件 1.v ...
- Harries-高性能分布式Asp.net通信框架
http://www.harries.cn/ 轻量级.免费.高并发的ASP.NET分布式通信框架 一.Harries简介: Harries Communication Framework 是一款基于C ...
- Linux的远程管理
一.远程管理 与个人用的计算机不同,服务器一般都是运行在IDG机房中,所以我们通常不会直接接触服务器硬件,而是通过各种远程管理方式对服务器进行控制 1.常见远程管理工具方式: -RDP(remote ...
- or 的判断
NeedCompact := NeedCompact or (AdoQ.ExecSQL > 0)