C语言/C++编程学习:四种类型指针

综合编程 2018-04-23 阅读原文

C语言是面向过程的,而C++是面向对象的

C和C++的区别:

C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。

C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。 所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”。

C与C++的最大区别:在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”,而就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。

很多小伙伴都老是会碰到疑问,其实还是基础没打扎实,这些题如果你不看答案你能知道多少呢?如果还有很多不知道就证明基础没打扎实,如果你还在入门纠结,如果你还在苦恼怎么入门!小编推荐一个学C语言/C++的学习裙【 六九九,四七零,五九六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

我们前面学了六种基本数据类型,后面还要学习其他类型,所有的类型都能派生出相应的指针,只需要在定义的时候加星号*就可以了,而且int* i和int *i是完全相同的,我们前面讲到const的时候说了,用它修饰的数据是无法改变的,由const就引出了四种指针,这也是公司招聘最喜欢出的题目之一。

const int *p1;

int const *p2;

int* const p3;

const int* const p4;

这四种类型,p1和p2是相同的,因为const放在数据类型的前面还是后面是无关紧要的,它们代表的是指向常量的指针变量,意思就是指针自身可以改变,它们可以指向其他地址,但是它们指向地址中的数据是不能改变的;p3代表常量指针,意思是指针自身不能改变,但是它们指向地址中的数据是可变的;p4是指向常量的常量指针,指针自身和指向地址的内容均不可改变,当然它和int const* const p4这种形式也是相同的。下面我们看一个程序:

其中错误示范和相关说明已经用注释的方式写明了,自己可以试试把注释里的错误示范添加进来,看看编译器下方的报错情况。

这个不是去背的,是要理解,有个最简单的原则就是就近原则,const和数据类型(这里举的例子是int)谁前谁后不要紧,关键是const和*哪个里指针变量近,如果是const离的近,那么表示指针p本身不变的值,但是*p是可变的;如果*离的近,那么表示*p是不变的(也就是const),p本身的值使可变的

接下来我们看多重指针变量,我们知道普通的指针变量里面存放的是指针(也即地址),然后地址里面存放的是数据,多重指针我们拿最简单的二重指针为例(当然也有三重指针、四重指针......但是那样难度会越来越大),我们的二重指针变量里面存放的是普通指针变量,普通指针变量里面存放的是地址,地址里才是最后的数据。我们还是以程序为例来讲解:

可以看到,变量num提供了两个信息量,它的地址是0022FF44,num里存放的数据是10,;普通指针变量ptr1可以提供三个信息量,ptr1指向地址中存放的值(即num)为10,ptr1本身的值(即&num)为0022FF44,还有ptr1自身的地址是0022FF40;二重指针变量ptr2提供了四个信息量,ptr2指向的不是普通地址而是指针变量ptr1。我们可以看到所能代表的信息量比普通指针要大,但是也比普通指针要难理解,所以我建议是指针层数不要超过3层,不然会变得相当难理解,我在下面画了个图供大家理解:

小编推荐一个学C语言/C++的学习裙【 六九九,四七零,五九六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

注意其中的%d是打印十进制,%p是打印十六进制,关于进制:

十进制是我们人类世界最普遍的进制,但是在计算机里面,它只能识别0、1,所以最常用的就是2的N次方进制,这样表示起来比较方便,比如二进制、八进制、十六进制。

十六进制:以16为基底,十六进制的数字等价于十进制的0~15,表示方式是0~9和A~F(或a~f)。因为我们需要一种方式区分十进制和十六进制,通常在十六进制前面加上0x或0X,所以如果在程序里见到0x66这种就是十六进制数

八进制:以8为基底,八进制数字为0~7,对应二进制中的3位,通常在八进制数前面加上0,例如014,就会被编译器看作八进制数。八进制数起源于计算机内存采用36位字的时代,那时一个字是3位,所以36位二进制字可以写成12个八进制数,不过八进制目前已经很少使用,知道它们就行了

二进制:以2为基底,只有0和1两种值,就是我们常说的0、1代码,也是计算机最底层能够识别的东西。经常有人说使用机器码编程的人才是真正的大神,所以很多人都认为就是使用0、1代码编程,这是完全坑爹的说法,就算使用机器码编程,也是使用十六进制,现在没有人会再次傻到用0、1来写代码的,假如在计算机内存地址为0x004935FF的地方有一条汇编语言指令:jmp 0x12345678,这就是一条跳转指令,翻译成机器码就是E8 74 20 EB 11,这个就是十六进制机器码,看不懂不要紧,主要就是让大家了解下有这么一回事就行了。

希望大家能够把前面的基础打牢固一点,前面的每个例子都要搞懂并且自己敲出来运行,不然学到后面会很吃力的,到时候又要回头来补基础知识,这样浪费的时间其实更多。有问题大家可以在群里提问。

最近重感了,睡得比较早,文章也没更新,我再最后强调一遍,有三种问题我是不会回答的:1是直接求代码的伸手党,2是网上找的代码出现的问题,3是没有任何提示信息的问题。很多人问问题就是这样,提示信息是什么?截图在哪?没有!代码在哪?没有!操作步骤呢?也没有!你是来提问题的,不是让别人来猜你的问题的,你给出了提示信息,别人可能两三分钟就帮你解决了,你什么都没有,你是在浪费大家的时间,连提问都不会的人有多大几率能得到正确的答案呢?

我们知道每一种数据类型都可以扩展出指针变量,那么普通变量和指针变量到底有什么不同呢,前面我们已经说了它们之间的一个不同点,就是它们存放的数据,同样的int i和int *p,假设我们同时为它们赋值为1,i=1和p=1,i=1表示往变量i的地址中存放整数1,而p=1表示往指针变量p的地址中存放地址1,可见同样的数据1,但是赋值给普通变量和指针变量所代表的含义是截然不同的。为了便于大家进一步的理解普通变量和指针变量的区别,我们今天讲它们的第二个区别,就是它们的大小不同,在我的32位机器上,我特意选取了char、short、int、double四种不同长度的类型来测试,程序如下:

小编推荐一个学C语言/C++的学习裙【 六九九,四七零,五九六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

由此可见,指针变量的大小在我的32位机器上是始终为4字节的,这是为什么呢,这是计算机组成原理的知识,不要求大家掌握,我简单的谈下,计算机里面有两个最重要的组件,cpu和内存,cpu是所有运算和控制的中心,内存里存放了最重要的代码和数据,cpu和内存之间有多条线进行连接,其中两组很重要的线叫做数据总线和地址总线,cpu从内存里取数据和存放数据,都是先通过地址总线来寻找内存中相关地址,从地址中得到数据或存入数据都是数据总线进行数据传送的,之所以称为32位机器,是因为机器表示数据使用的是32根数据线(每根数据线只能表示0或者1)传送数据,我们可以想到数学里的排列组合,如果是2根数据线,那么我们能表示的数据大小是2的2次方(0~2的2次方-1);如果使用8根数据线,那么能表示的数据大小为2的8次方(0~2的8次方-1),这其实就是古老的8位机;如果使用16根数据线,能表示的数据大小就是2的16次方(0~2的16次方-1),这就是32位机器的上一代产品16位机器;然后就是我们使用32位数据线的32位机器;再接下来还有64位机器。在我的32位机器上使用的地址总线也是32根,很显然它能表示的内存地址大小就是2的32次方,范围为0~0xFFFFFFFF(16进制一位代表4位二进制,这在前面已经讲过),所以指针大小自然就是32位,即4个字节。

这些是C/C++能做的

服务器开发工程师、人工智能、云计算工程师、信息安全(黑客反黑客)、大数据 、数据平台、嵌入式工程师、流媒体服务器、数据控解、图像处理、音频视频开发工程师、游戏服务器、分布式系统、游戏辅助等

简书

责编内容by:简书阅读原文】。感谢您的支持!

您可能感兴趣的

Including DPDK libs into your C++ project DPDK is written in C and it is expected to be used in C environments. Ye...
Google Play Games Services C++ SDK 3.0 Released Posted by Clayton Wilkinson, Developer Relations We're pleased to announce the...
Ask HN: When has switching the language/framework ... It's always fun to look at different (micro)benchmarks comparing language/framew...
std::is_sorted in C++ The C++ function std :: is_sorted checks if the elements in range are sorted i...
HTML Extension method for returning formatted HTML... What is this for? This post shows you how to create an extension method for re...