一:指针的定义
1-1:简单来说,我们的内存是可以被切分成一个个内存单元的,对于计算机为32位的,其每个内存单元的大小是四个字节,也就是八个比特位,而目前经常使用的是62位,对应的每个内存单元就是八个字节,可以存取的数据更加多了。而每个内存单元都有自己的编号,以便于计算机想要调用它时,可以快速的拿到。举个生活中的例子,我们居住的房间或是公寓其都有自己的门牌号,但你有朋友来找你的时候,你可以把自己的门牌号告诉他,他就可以很高效的找到你,同理,在内存中,也是如此,但你想要访问一个特定内存的内容时,你可以通过它的内存编号来找到它,而这个内存编号又被称为地址,地址其实就是指针。(内存单元的编号==地址==指针)
1-2:理解编址
2.指针变量与地址
2-1 取地址符号(&)
ps:&,此也可以表示按位与
int a=10;
int*p = &a; 其中的&,表示其向计算机声明其要取出a这个整型的地址
2-2 指针变量(类型*)
指针变量就是为存储指针的,用来存放所取得的地址
例如:
指针类型除了有int*,还有char*,double*...
2-3 解引用操作符(*n)
解引用操作符,其实就是为通过指针变量里面放置的指针(地址)来找到对应数据的内存,然后将其里面的内容进行更改。
例如
2-4 void*指针
定义:其指的是无具体类型的指针,所以但你在写代码时,你并不确定一个指针的类型要设为什么时,就可以了利用void*类型的指针,但是其局限性在于其无法进行指针的加减运算还有解引用。
这里可以看到,在给pa解引用时,编译器报错,在对pa进行加和时,编译器也报错。
3.const修饰的指针
(理解:const修饰的变量被称为常变量,其本质上仍然为变量,但是在利用const修饰后,其数值时无法更改的),接下来,来介绍一下两种类型的const修饰指针的类型
3-1 把const放置在了*pa前面
此中,我们把const添加在了*pa前面,但我们先要理解一下什么是*pa,pa
而const修饰在 *pa前面,其表示的意思就是把pa通往空间a的通道给封死,让pa无法通过此通道来改变a内部的数据,所以,当下面你要通过*pa来改变a的数值时,其实会报错的,但是其并没有把pa给封死,pa仍然可以和其他空间内存建立联系,例如写成int b=2;pa=&b;编译器是不会报错的。
3-2 把const放置在pa前面
当把const放置在了pa前面的时候,其相当于就是锁定住了pa,不让其改变pa内部存储的内容,所以当你写pa=&b;时,编译器会报错,但是其并没有封死住pa与a之间的连接通道,所以可以通过解引用来改变a内部的内容。(即*pa=10;编译器不会报错)
4.指针的运算
4-1指针减去指针,表示的为地址减去地址,得到的为指针与指针之间的元素个数
例如:
此中,将首元素的地址与末元素的地址进行相减,得到的就为两个元素之间的而元素个数
4-2指针的关系运算--可以利用指针来作为if或是while的判断条件
例如
5.野指针
5-1:未对指针进行初始化,而野指针的位置就是不确定的,随机的,也就会占用到其他的内存空间中,如果再利用上解引用,就属于非法访问了
5-2:对于越界访问,比如一个只包含十个元素的数组,你硬是往里面塞了12个元素,之后,你要对其数组中的每个元素进行地址提取,最后的两个就是属于越界,然后会存在非法访问。
5-3:对于空间释放后,又去访问的,也是非法。
6.assert断言
定义与作用:在assert.h头文件中定义了宏assert(),用于在运行的时候确保程序符合指定条件,若不符合就会终止程序并报错,而这个宏常被称为断言。
举个例子:
其可以放在一个函数中,其表达的是若这个指针里面的内容不为空指针(既有进行初始化等操作),就会返回真,而程序正常运行下去,若为空指针,则会返回假,程序会被终止,然后编译器报错。
7.指针的使用与传址调用
首先,我们来回顾一下之前一直在使用的传值调用:
函数得到的x与y的值,是通过实参a与b传输过去的,这个是传值调用。
那么传址调用,顾名思义,就是把实参的地址传输给形参,让形参变量里面存储的内容是地址,从而可以通过调用这个地址来找到或更改实参里面的内容。
那么,我们来看一些例子,从而可以更加深入的理解指针的重要性与好处。
例1:利用函数来实现数字的交换
此处利用传值交换,但是发现结果不对,这是因为传值调用,其中实参与形参所占据的内存空间是不同的,在实参将数据传递给形参后,形参通过函数内部的算法得到一个结果,但是这个结果仍然是放在形参的内存空间中,并没有传递给实参,而形参在函数调用完后就被销毁,回到main函数中,其结果仍旧不会改变。因此,才引入了传址调用。
通过传址调用,就可以轻松解决问题,那么,为什么会这样呢?因为,传址调用,就是通过向函数传入地址,而形参就要相应的变为指针变量,来接受地址,然后通过解引用来找到实参的空间,直接将其内部的值进行更变。
目前只是讲到了指针的一些简单使用,后续还会有数组指针,函数指针等内容。