整数转指针测试,分析具体原因
有时我们在编程时,会有一个想法,比如将整数强制转换成指针类型,像这种想法,我相信程序猿都会有过。
指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。C++中有各种类型的指针,char*、int*、long*、bool*、float*、double*、void*等,还有函数指针,总之指针是非常强大的,无所不能,正应如此强大伴随着也是凶险随处可见。
有时我们在编程时,会有一个想法,比如将整数强制转换成指针类型,像这种想法,我相信程序猿都会有过。
指针是一个难点也是重点,理解好指针对后续代码编写将有非常大的帮助。
指针的运算可以有很多,不是书本上或老师讲的只有加减运算。指针其时还有别的运算。大家可以大胆的去想,不要被书本上的知识束缚了自己的思考。
有几个难点,指针:二重指针、一重指针、一维数组
二重指针:它指向的值还是指针
一重指针:它指向的值可以解引用*,得到数值,但一定要知道指针的类型。不然编译器元法知道如何解析的哪段内存。
一维数组:就是一段连续的内存,数组名也是数组头指针。
向上转换:是派生类(子类)向基类(父类)转换。
向下转换:是基类(父类)向派生类(子类)转换。
nullptr关键字就是表示空指针的意思,C++11之前空指针都是NULL。已经有了NULL哪为什么还要有nullptr关键字?
nullptr表示空指针,不能转换为整型类型。为了向后兼容,C++11仍允许用0(NULL)来表示空指针。建议使用nullptr而不是0(NULL),因为更高的类型安全。
auto_ptr是如何实现智能指针,主要思想在于将指针包装后存放在栈上,这样就能自动清除工作,这是内存栈的特点。int a = 0; //a变量存放在栈上哪auto_ptr是如何实现呢?
auto_ptr就是智能指针,它其实是一个类类型,定义
1.两个auto_prt指针不能指向同一个内存:
2.不要将auto_prt对象作为STL容器的元素,C++标准明确禁止这样做。
3.不能将数组作为auto_ptr的参数
大家在学习C++语言的时候,讲到类的访问权限问题时,对私有的private部份访问,书上写的都是只能是类内成员可以访问,也就是成员函数可以访问。类外部是不可以访问到,也修改不了值的。
今天跟大家讲一下比较锋茫的方法,在类外用指针来实现修改类内私有pravite成员。(指针是一把双刃 剑,一定要完全理解,不然会伤到自己)。学习以下内容还有预备知识,如果知道类在内存中存放,可以不用看,不明白的可以先看这篇:类中成员定义顺序在内存中排列
我们知道int一般是4字节,char是1个字节。哪么将这两个类型写到类中定义一个新类型,在内存中又会是占几个字节呢?有人可能会认为就是简单算术加,其时并非这样。写段类定义代码来测试验证类中成员在内存中如何排列。
如果大家有细心看上面的代码,会发现,还有一个问题?就是类中定义了一个set()成员函数,但用sizeof关键字计算字节长度并没明将set()函数占的计算在内?这里要讲的是成员函数实际上并不属于对象,它只是一种“特殊的全局函数”。编译器具体怎么编译实现成员函数,C++标准中没有规定这点。但以后要记住一点的是“类对象占内存大小是指成员变量,不含成员函数”,就可以了。