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

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++能做的

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

你可能感兴趣的:(C语言/C++编程学习:四种类型指针)