一.指针的定义
1.引入
1.指针是内存中一个最小单元的编号,也就是地址。
2.平时我们口头中说的指针是指指针变量。
总结:指针就是地址,口语中说的指针是指指针变量。
内存 | 地址 |
一个字节 | 0xFFFFFFFF |
一个字节 | 0xFFFFFFFE |
...... | ...... |
一个字节 | 0x00000000 |
如表中所示,一个小方框就代表一个内存单元,程序运行的时候会加载到内存中,也会使用内存空间。
假如我们需要从内存中找到某个元素,就只需要获取它的地址,从而远程操纵这个数。
在此我们引出一个熟悉的符号‘&’(取地址运算符),如&a — 就是取出a的地址,且取出的是第一个字节的地址(较小的地址)。
2.指针变量
1.指针变量定义:指针变量是一种变量,用来专门存放地址。
经过上文论述,我们现在把a的地址赋给pa,即pa = *a;则pa就是指针变量。
如果a是int型,则pa是int型指针,记作int* pa = &a;
3.深入理解
如图,两种输出的输出结果都是一样的。
如果我们想通过a的地址来操控a,则只需引用*pa,此时*pa就操控了pa,此操作称为解引用。
‘*’被称为指针运算符,假如我想将a的值改为20,则仅需以下操作,如图所示:
4.总结
1° 指针变量是用来存放地址的,地址是唯一标示一个内存单元的。
2° 指针的大小在32位平台是四个字节,在64位平台是8个字节。
二.指针类型
1.思考
上文中我们提到了在某些平台中指针被分配的内存一般是4或8个字节,既然被分配的内存已经定下来,那么定义指针类型的意义是什么呢?为什么不能用一个通用的类型来统一指针?
此问题将会贯穿本章节。
2.对指针类型的深入理解
我们不妨从下面的代码中来体会:
如图,我们创建一个整型变量a,初始化为一个十六进制的数。并对其进行取地址操作,创建一个指针变量pa用来存放a的地址。
我们在内存中找到a所占的内存,如下图所示。(关于这里为什么a的字节是倒序排列保存本章暂且不做论述。)
接下来我们进行调试,通过对*pa赋值为零我们可以看到a的值已经变为零。
那如果我们用一个char型指针来改变a会发生什么呢?如下图所示:我们通过强制类型转换,将int型指针pa变为char型指针pc,但我们将其赋值为零,但却只将它第一个字节改为00,后面三个字节并没有改变。
由此我们可以大概瞥见端倪,我们不妨多做几次指针类型不同的实验就可以轻易得出以下结论:
指针类型其实是有意义的:不同类型的指针类型决定了在解引用操作时一次性访问几个字节,如:如果是char*型指针,则一次性访问1个字节;
如果是int型指针,则一次性访问4个字节;
如果是float型指针,则一次性访问4个字节;
如果是double型指针,则一次性访问8个字节......
读到这里,有些好奇的同学就要问了:
int和float类型指针都是一次性访问4个字节,那他们之间就可以相互替代了吗?我们不妨再来做一个实验,如下图所示:
输出结果如下图所示:
可以发现,float型指针变量并不能和int型指针变量相互混用,否则就会出现错误。
3.野指针
1.概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
2.出现原因:(1)指针未初始化.
(2)指针的越界访问
(3)指针指向的内存空间释放(此问本章暂且不做论述)
3.实例
两种情况依次如下图所示:
图2中当i>=5时,p指针就变为了野指针,越界访问数组。
4.如何正确的避免野指针:
1. 指针初始化
2. 小心指针越界
3. 指针指向空间释放即使置NULL(空指针,专门用来初始化指针)
4. 避免返回局部变量的地址
5. 指针使用之前检查有效性
三.指针的关系运算
1.指针+-整数的值
我们不妨来思考一下下图程序的输出结果是什么呢?
通过上文对指针类型的深入理解,这里我们不妨大胆猜测一下:char*型指针+1,就加1个字节;int*型指针+1,就加4个字节,以此类推,我们来看一下输出结果:
我们分别定义了char*的pc和int*型的pi两个指针型变量,从输出结果我们可以看到:char*型指针+1,跳过了一个字节,int*型指针+1,跳过了4个字节,足以证明我们的猜测是正确的。我们可以做出如下总结:
指针类型决定了指针的步长,如char*型+1跳过一个字节,int*型+1跳过4个字节......
2.指针-指针
1.前提:两个指针要指向同一块空间
通过上文我们对指针整数运算的认识,我们思考一下指针与指针的减法又是什么样的呢?
我们做个实验来一探究竟:
由实验我们可以知道,指针与指针相减得到的其实是两个指针之间的元素个数的绝对值。
我们由此可以在将我们求字符串长度的函数改进一下:
我们之前的函数是这样写的:
我们学了指针就可以用如下形式表示:
如图所示,我们通过指针-指针的形式算出了字符串的个数。
如有错误,恳请指正。
标签:字节,int,地址,pa,讲解,指针,我们,入门 From: https://blog.csdn.net/Poeir_/article/details/143134781