关于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 ...
随机推荐
- [ajax] - 上传图片,视频后的路径回传及确定逻辑
业务场景1: 后台要上传视频,图片到网站的首页或者附页,上传后,视频,图片存储到服务器或cdn,但是此时还要加确定按钮以实现该视频,图片路径数据库的插入操作. 页面展现: 点击操作按钮,触发input ...
- 《温故而知新》JAVA基础四
类的封装 定义:将类的一些信息隐藏起来,不允许外部的程序直接的访问,而是通过该类提供的一些方法来获取 好处:只能通过特定的法方法访问数据,保护了数据, 实现封装的步骤: 修改属性的可见性:(一般类属性 ...
- Tomcat配置服务和自启动
Tomcat配置服务和自启动1.Tomcat配置服务 假设Tomcat的安装路径为/usr/local/tomcat 1 为Tomcat添加启动参数 catalina.sh在执行的时候会调用同级路径下 ...
- StringRedisTemplate常用API
转载自网络: //向redis里存入数据和设置缓存时间stringRedisTemplate.opsForValue().set("test", "100",6 ...
- 【SQL Server备份恢复】维护计划实现备份:每周数据库完整备份、每天差异备份、每小时日志备份
在数据库管理中,数据库备份是非常重要的. 通过维护计划向导,可以很方便的完成数据库备份. 下面的例子说明了如何实现数据库的备份,具体的备份策略是:每周日一次完整备份.每天差异备份(除周日外).每小时日 ...
- Systemd程序及相关命令
Systemd程序及相关命令 Systemd是一款用于Linux操作系统系统管理和服务管理的工具.它向后兼容SysV init脚本,并且支持许多类似于startup系统服务的功能,比如系统快照(sna ...
- Hadoop经典案例(排序&Join&topk&小文件合并)
①自定义按某列排序,二次排序 writablecomparable中的compareto方法 ②topk a利用treemap,缺点:map中的key不允许重复:https://blog.csdn.n ...
- mysql 表中已经存在数据 修改字段类型 varchar(11) 改为 int(11)
update tablename set s_role = '' alter table tablename modify column s_role int(11)
- 简单函数template max
#include <iostream> #include <vector> #include <algorithm> #include <string> ...
- CF727F [Polycarp's problems] & [EX_Polycarp's problems]
原题题意 给出长度为n的有序数组,m次询问,每次给出一个正整数x.你要删除数组中最少的元素,使得数组中的前缀和+x都为非负整数.允许离线,n≤750,m≤200,000. 原题思路 首先注意到,x能成 ...