c语言:初识指针(二)

柔情只为你懂 2024-03-31 10:25 197阅读 0赞

初识指针

  • 一.野指针
    • 1.野指针形成原因一是:未初始化
    • 2.野指针形成原因二:指针越界
    • 3.野指针形成原因三:指针所指向的内存空间被释放
  • 二.指针的运算
    • 1.指针+-整数运算
    • 2.指针-指针
    • 3.指针的关系运算
  • 三.指针和数组
  • 四.二级指针
  • 五.指针数组
    • 1.定义
    • 2.用一维数组来模拟二维数组

在这里插入图片描述

一.野指针

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

1.野指针形成原因一是:未初始化

在这里插入图片描述

当我这样写时,p是一个局部变量,没有初始化,那么p内就是一个随机值,那么编译器就会把这个随机值看作地址(某个内存单元编号),那么你解引用P,编译器就会找到这一个地址所对应的内存单元,将里面的数据变为20,但这种操作是很危险的,因为你根本不知道这个20存到了哪,你就无法找到它,相当于就白存了

在这里插入图片描述
在这里插入图片描述

像这种将a的地址存到p内,我们就可以准确找到这个地址所对应的内存单元,从而找到并使用这个内存单元内存的数据

2.野指针形成原因二:指针越界

在这里插入图片描述
在这里插入图片描述

这里arr数组内只有10个元素,但我却访问了11个元素,当我访问到了第11个元素时,就越界了,越界了会发生什么呢

在这里插入图片描述

它会产生一个随机值

3.野指针形成原因三:指针所指向的内存空间被释放

在这里插入图片描述

这里在创建a后我们向编译器申请了4个字节的内存,我们在完成函数test后,返回了一个a的地址,但在test函数结束后,编译器会销毁为test函数所创造的空间,所以你返回的地址所对应的内存实际上已经没有了,所以这个返回值无效

二.指针的运算

1.指针±整数运算

在这里插入图片描述

这里*p++其实由于解引用的优先级很低,所以其实是 * (p++),p++由于是整形,一次跳过4个字节,又由于arr类型是int,其中每个元素都是4个字节,所以+1相当于跳过一个元素,而我每跳过一个元素就把该元素改为0,故打印出来数组的元素全部为0

同理-1就是向前跳跃改指针所对应类型的字节大小

2.指针-指针

前提:两个指针得指向同一块空间
得到的是两个指针之间的元素个数

在这里插入图片描述
在这里插入图片描述

3.指针的关系运算

指针的大小比较实际上就是该指针所存的地址大小比较,就是那一串编号

在这里插入图片描述

三.指针和数组

数组是向编译器申请一块内存来存放数据
指针(变量)是用来存放地址,我们可以通过指针来访问数组

四.二级指针

在这里插入图片描述

这里我们设a=10,给a 4内存单元,每个内存单元都是1个字节,每个内存单元都有各自的编号,我们取出的是首字节编号,我们假设a的编号是如上图,pa内存的就是这个编号。

在这里插入图片描述

那么二级指针就是用来存放一级指针的地址

我们创造一个二级指针ppa,如果pa它的地址是如图,那么ppa内存的就是pa的地址

在这里插入图片描述
在这里插入图片描述

五.指针数组

1.定义

指针数组就是用来存放指针的数组

其实与整形,字符型数组一样都是用于存放数据

在这里插入图片描述

ps:这里插个小知识:我们访问数组内部的元素时都是使用下标如arr[0]。实际上,编译器会自动将这种写法改为 解引用(arr+0),因为arr代表首元素地址,+0就表示该数组第一个元素地址,再解引用就可以得到该元素。同理,arr[9]就是 解引用(arr+8)

2.用一维数组来模拟二维数组

在这里插入图片描述

如果我想创建一个3行4列的二维数组,那我们创造三个一维数组,以及一个指针数组

在这里插入图片描述
在这里插入图片描述

注意在这里a,b,c是数组的名字代表数组的首元素地址,我们用一个指针数组arr将a,b,c三个数组的首元素地址存起来,那么arr[0]就代表a数组的首元素地址,arr[1]就代表b数组的首元素地址,arr[2]就代表c数组的首元素地址。

这里arr[i][j]其实就是 * (arr[i]+j),那么我们就可以理解其实就是分别用每个数组的首元素地址+j再解引用,就可以把三个数组联系起来,从而得到一个二维数组

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,197人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C语言

    这是初识c语言的第二课,有在学c和刚开始学c的可以持续关注一下,博主会继续更新c语言笔记,给大家借鉴和参考。 目录 1.变量和常量 定义变量的方法 变量的分类 sca

    相关 C指针

    什么是指针?   指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的

    相关 C语言-指针

    有人说:指针是C语言最大的优势之一 也有人说:指针是C语言的灵魂 但总的来说,不掌握指针就是没有掌握C语言的精华。 说了这么多废话,我们来看看指针到底是什么吧。

    相关 C指针(3)

    指针与数组 指针变量除了可以对其引用的地址的内容进行运算外,其本身也可以进行运算。指针是内存中的一个地址,对指针本身的支算只能是指针在内存中位置的改变,即指针可以进行加

    相关 C指针(2)

    当在程序中定义一个变量时,系统就在内存中为该变量分配一个大小合适的存储空间,这个存储空间的大小由变量的类型决定,一个int型变量占2个字节,一个float的变量占4个字节,数组

    相关 C 指针(1)

    计算机为声明的变量分配内存的形式:在程序代码中,使用变量名来引用这块内存,当程序编译后执行时,计算机就使用内存位置的地址来引用. 指针也是变量,只是它存储的内容是其它变量的内