初阶指针详解

大家好,今天追秋再一次与大家见面啦!!!
今天给大家带来的是关于指针的一些知识,喜欢的朋友们可以点个关注哦

指针是什么?

指针理解的2个要点:

  1. 指针是内存中一个最小单元的编号,也就是地址
  2. 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量

总结:指针就是地址,口语中说的指针通常指的是指针变量。
下面给出内存的一些理解:
初阶指针详解_第1张图片

指针变量
我们可以通过&(取地址操作符)取出变量的内存其实地址,把地址可以存放到一个变量中,这个变量就是指针变量

下面我们开始讨论指针

指针和指针类型

这里我们在讨论一下:指针的类型
我们都知道,变量有不同的类型,整形,浮点型等。那指针有没有类型呢?
准确的说:有的。
当有这样的代码

int num = 10;
p = #

要将&num(num的地址)保存到p中,我们知道p就是一个指针变量,那它的类型是怎样的呢?

我们给指针变量相应的类型:
也就是之前定义变量的类型是相同的:

char* p=NULL
short* p=NULL;
;int* p=NULL;
还有其他类型的指针就不一一列举了

下面给出解释:
初阶指针详解_第2张图片
其实:

char* 类型的指针是为了存放 char 类型变量的地址。
short* 类型的指针是为了存放 short 类型变量的地址。
int* 类型的指针是为了存放 int 类型变量的地址

我们知道,**在固定的环境下,指针的大小是固定的,在32/64位机器上分别是4/8字节的大小,那既然指针大小都是一样的,为什么还要去设立其他的指针类型呢?为什么不用一种通用的指针来进行使用呢?**下面就给大家详细讲解一下:
下面还是老规矩,举例来说明指针类型的意义

指针的解引用

初阶指针详解_第3张图片
初阶指针详解_第4张图片
仔细看的小伙伴可以发现,两次调试使用的指针类型是不一样的,最后得到的结果也是不一样的,所以:

总结:不同类型的指针大小虽然一样,但是指针类型决定了指针在进行解引用操作的时候可以申请访问的字节数,也就是使用的字节的范围大小(如上面例子所示),
比如:char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。和我们之前学习的基本类型所占空间的大小是一致的。

指针±整数

下面举例:
初阶指针详解_第5张图片
总结:指针的类型决定了指针向前或者向后走一步有多大(距离)。

因此,我们在访问内存空间的时候,选择合适的指针类型会让我们的解题更加方便,误会造成不必要的困难

野指针

概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

野指针成因

  1. 指针未初始化
    初阶指针详解_第6张图片
  2. 指针越界访问
    初阶指针详解_第7张图片
  3. 指针指向的空间释放
    初阶指针详解_第8张图片

注:这里给大家举一个简单的例子其中包含的内容较多,博主现在还是个小渣渣,还无法写道更加详细的内容,大家可以期待一下以后的博文更新。

如何规避野指针

1. 指针初始化

初阶指针详解_第9张图片

2. 小心指针越界

这个点可以参考野指针成因里面的讲解。

3. 指针指向空间释放即使置NULL

当指针指向的地址被释放,及时将该指针置为空指针,也就是NULL。

4. 避免返回局部变量的地址

这个点可以参考野指针成因里面的讲解。

5. 指针使用之前检查有效性

初阶指针详解_第10张图片

指针运算

指针± 整数

老样子我们还是举例来解释:
初阶指针详解_第11张图片
初阶指针详解_第12张图片

指针-指针

初阶指针详解_第13张图片
指针-指针的功能实现:
初阶指针详解_第14张图片

指针的关系运算

看这部分代码来说明:(其它未写部分均有效)

#define N_VALUES 5
float values[N_VALUES];
float *vp;
for(vp = &values[N_VALUES]; vp > &values[0]
{
*–vp = 0;
}
初阶指针详解_第15张图片
初阶指针详解_第16张图片

指针和数组

我们知道数组名表示的就是数组首元素的地址,当然有普遍性就有特殊性,下面我们来看:
初阶指针详解_第17张图片
初阶指针详解_第18张图片

二级指针

我们知道,指针变量也是变量,而指针不就是用来存放地址的吗?下面我们来看二级指针
初阶指针详解_第19张图片
初阶指针详解_第20张图片

指针数组

指针数组,是数组,是用来存放指针的数组
举例:初阶指针详解_第21张图片
我们可以用指针数组模拟实现二维数组:
初阶指针详解_第22张图片

好了,到这里我们今天的分享就到这里了,期待我们的下次见面!!!

你可能感兴趣的:(开发语言,c语言)