C语言:指针(进阶)

2023-11-18

目录

指针

指针概念

a.什么是地址?

b.什么是指针?

指针变量

a.指针变量是用来做什么的?

b.指针变量的类型怎么理解?

&和*操作符

a.单目操作符&是什么?

b.单目操作符*是什么?

二级指针

a.二级指针是什么?

指针类型的意义

a.为什么指针要有类型?

b.指针类型的意义是什么?

野指针

a.什么是野指针?有什么危害?

const修饰指针


板块

  • 指针概念
  • 指针变量
  • &和*操作符
  • 二级指针
  • 指针类型的意义
  • 野指针
  • const修饰指针

提问

  • 什么是地址?
  • 什么是指针?
  • 指针变量是用来做什么的?
  • 指针变量的类型怎么理解?
  • 单目操作符&是什么?
  • 单目操作符*是什么?
  • 二级指针是什么?
  • 为什么指针要有类型?
  • 指针类型的意义是什么?
  • 什么是野指针?有什么危害?

指针

指针概念

a.什么是地址?

        地址是指内存中的位置,每个变量、数组或函数都在计算机的内存中占据一定的空间。每个内存位置都有一个唯一的地址,用于标识和访问该位置。可以将地址视为内存中的房间号码,用于定位和访问数据。

b.什么是指针?

        指针是一种特殊的变量类型用于存储内存地址。它指向(或引用)内存中的某个位置,使得我们可以通过该地址直接访问和修改内存中的数据。

指针变量

a.指针变量是用来做什么的?

  1. 直接访问内存:指针变量存储了一个内存地址,通过间接访问运算符(*),可以直接读取或修改该地址处的值。这使得指针成为一种强大的工具,可以直接操作内存中的数据。

  2. 动态内存分配:通过指针和相关函数(如malloc()calloc()realloc()),可以在运行时动态地分配内存。这对于处理不确定大小的数据结构(如动态数组、链表等)非常有用。

  3. 数组和字符串处理:指针可以用于方便地遍历和修改数组中的元素,以及进行字符串操作。通过指针算术和指针的递增/递减操作,可以有效地访问数组中的不同元素。

  4. 函数参数传递:通过指针参数,函数可以直接修改调用者传递的变量的值。这种方式称为通过引用传递,通过指针传递的地址可以避免复制大型数据结构,提高了效率。

  5. 动态数据结构:指针可用于实现动态数据结构,如链表、树和图等。通过指针的连接和指向,可以灵活地管理和操作这些数据结构。

  6. 函数指针:指针变量还可以指向函数,从而实现函数指针的概念。函数指针可以作为参数传递给其他函数,或者用于实现回调函数,以根据运行时条件动态选择调用的函数。

        指针变量的使用使得C语言更加灵活和高效,但也需要小心处理,避免野指针、空指针和指针越界等问题。正确和谨慎地使用指针可以提高程序的效率,并且允许处理更复杂的数据结构和算法。

b.指针变量的类型怎么理解?

        

        指针变量的类型是指它所指向的数据的类型。在C语言中,指针变量的类型与所指向的数据类型必须匹配。这是因为不同类型的数据在内存中占据不同的空间,并且以不同的方式进行解释和处理。

指针变量的类型包括以下两个方面:

  1. 指针的基本类型:指针本身具有基本的类型信息,用于指示它所指向的数据的类型。例如,int *ptr中的*ptr表示ptr是一个指向整型数据的指针。这个基本类型信息决定了如何解释和操作指针变量。

  2. 所指向的数据类型:指针变量指向的数据类型是指它所引用的内存位置中存储的数据的类型。例如,int *ptr中的int表示ptr指向的是一个整型数据。这个数据类型信息决定了编译器在进行指针操作时的行为。

&和*操作符

a.单目操作符&是什么?

        单目操作符&是取地址运算符。它用于获取一个变量的地址

b.单目操作符*是什么?

        

        单目操作符*是间接访问运算符,也称为解引用运算符。用于访问指针所指向的内存位置的值

二级指针

a.二级指针是什么?

        

        二级指针是指指向指针的指针。在C语言中,可以使用二级指针来间接引用和修改指针变量的值。

        二级指针的声明使用两个星号(**)来表示,例如int **pptr表示一个指向指针的指针。

指针类型的意义

a.为什么指针要有类型?

        指针在C语言中具有类型是为了保证数据的正确解释和操作:

        

  1. 内存解释:指针的类型告诉编译器如何解释和操作指针所指向的内存位置中存储的数据。不同类型的数据在内存中占据不同的空间,并以不同的方式进行解释和处理。指针的类型提供了这种数据解释的信息。

  2. 指针运算:指针类型决定了指针的算术运算。例如,对一个int类型的指针进行递增操作时,编译器会根据指针类型来决定递增的步长,以确保正确地指向下一个相邻的元素。

  3. 类型检查:指针的类型可以进行类型检查,以确保指针的操作与所指向的数据类型相符合。编译器可以在编译时检查指针的类型,并发出警告或错误,以防止类型不匹配的问题。

  4. 内存安全性:指针的类型有助于确保内存的安全性。通过指针的类型信息,编译器可以帮助我们避免野指针和指针越界访问等问题,提高程序的健壮性和安全性。

  5. 数据访问和修改:指针的类型决定了对指针所指向的数据进行访问和修改的方式。通过正确的指针类型,我们可以确保对指针所引用的数据进行正确的读写操作,避免类型不匹配和数据损坏等问题。

b.指针类型的意义是什么?

  • 指针的类型决定了指针向前或者向后走一步有多大(距离)。
  • 指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。

示例:

int*p; p+1--> 4

char*p p+1-->1

doule*p p+1-->8

野指针

a.什么是野指针?有什么危害?

        野指针是指一个指针变量,它包含了一个无效或未初始化的内存地址,即指针没有正确地指向有效的对象或内存位置。

        

  1. 未初始化的指针:当声明一个指针变量但未对其进行初始化时,指针的值是不确定的,可能包含任意的内存地址,这就是野指针。

  2. 已释放的内存:当一个指针继续指向已经被释放或销毁的内存块时,该指针就成为野指针。

  3. 指针越界访问:当一个指针指向的范围超出数组的范围时,改指针就是野指针

        危害:

  1. 未定义的行为:当使用野指针访问或修改内存时,会产生未定义的行为。这可能导致程序崩溃、数据损坏、程序运行时错误等问题,很难进行调试和修复。

  2. 内存安全性问题:野指针可能指向已经被其他对象或变量使用的内存块,这会导致数据的错误读取或写入,可能覆盖其他对象的数据,造成程序逻辑错误或安全漏洞。

  3. 系统崩溃和异常:野指针可能导致程序崩溃或异常终止,这会影响程序的稳定性和可靠性

        措施:   

  1. 声明指针变量时,及时进行初始化,并将其指向有效的内存位置或设置为NULL

  2. 在释放内存后,将指针设置为NULL,以避免成为野指针。

  3. 在使用指针之前,进行有效性检查,确保指针指向有效的内存位置。

const修饰指针

        const关键字可以用来修饰指针,以表示指针所指向的数据是常量,不允许通过该指针修改数据的值。

        用法:

  • const修饰指针本身:在指针类型前加上const关键字,表示指针本身是常量,即指针的值不可修改。

例如:

const int *ptr;  // 声明一个指向常量整数的指针

这样声明的指针ptr可以指向一个整数常量,但不能通过ptr来修改所指向的整数的值

  •  const修饰指针所指向的数据:在指针指向的类型前加上const关键字,表示指针所指向的数据是常量,即不能通过该指针修改所指向的数据的值。

例如:

int *const ptr;  // 声明一个指针常量,指向整数类型

这样声明的指针ptr是一个指针常量,它的值不可修改,一旦指向某个内存地址,就不能再指向其他地址。但是可以通过ptr来修改所指向的整数的值。

        总结:如果const放在*的左边,表示指针指向的数据是常量;如果const放在*的右边,表示指针本身是常量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言:指针(进阶) 的相关文章

随机推荐

  • Seata1.4.2+Nacos搭建使用

    Seata1 4 2 Nacos搭建使用 前言 一 搭建seata1 4 2服务端 1 下载seata1 4 2 2 创建相关数据库和表 3 配置Seata 1 4 2 4 启动seata1 4 2 二 客户端使用seata1 4 2 1
  • 蓝桥杯题目练习(星际交流)

    算法训练VIP 星际交流 原题链接 星际交流 题目描述 人类终于登上了火星的土地并且见到了神秘的火 星人 人类和火星人都无法理解对方的语言 但是我们的科学家发明了一种用数字交流的方法 这种交流方法是这样 的 首先 火星人把一个非常大的数字告
  • 深度CV基础——图像噪声和滤波

    一 图像噪声 1 图像噪声的概念 图像噪声是图像在获取或是传输过程中受到随机信号干扰 妨碍人们对图像理解及分析处理的信号 很多时候将图像噪声看做多维随机过程 因而描述噪声的方法完全可以借用随机过程的描述 也就是使用随机过程的描述 也就是用它
  • SQL Server 修改字段属性信息报错

    当表创建好以后再次修改表信息保存会出现 选择Tools gt Options 选中勾掉点OK就可以了
  • docker-compose单机容器编排的神器

    docker compose和docker兼容表 简介 docker所制作的容器多半需要大量的依赖 有些可能依赖于其他容器的启动 比方说一个springboot的项目 它需要rabbitMQ和esearch什么的 有些没装数据库的机器需要m
  • STM32 GPIO的基础实现

    什么是GPIO GPIO 英文全称 general porpose intput output 即 通用输入输出端口 顾名思义 芯片最基本的输入输出接口 STM32或其它单片机芯片的GPIO引脚可以与外部设备连接起来 可以实现与外部设备通讯
  • Spring系列之@Value【用法、数据来源、动态刷新】

    面试官 Spring中的 Value用过么 介绍一下 我 Value可以标注在字段上面 可以将外部配置文件中的数据 比如可以将数据库的一些配置信息放在配置文件中 然后通过 Value的方式将其注入到bean的一些字段中 面试官 那就是说 V
  • 关于DYNPRO程序的系统迁移与版本不匹配问题之一

    前段时间公司做的一个项目 这两天在将项目程序导入公司 出问题了 搞了半天才发现是系统版本问题 但是还是不知道怎么解决 纠结ING DYNRPO程序在创建 或是首次运行 的时候会自动生成一个DYNRPO组件程序的类 这个程序是后台解析DYNP
  • 优惠券秒杀(一)

    L1296686146 冗谪 2023 07 20 08 18 发表于陕西 收录于合集 redis7个 优惠券秒杀 数据表 优惠券的表 优惠券的基本信息 优惠金额 使用规则等 CREATE TABLE tb voucher id bigin
  • RESTful API介绍

    1 什么是RESTful API 一种流行的API设计风格 2 为什么使用RESTful架构 REST 是 Representational State Transfer 的缩写 如果一个架构符合 REST 原则 就称它为 RESTful
  • 服务器老是提示内存不足

    jps mlvV 查进程 jmap heap 进程ID 查看内存是多少 JAVA OPTS Xms1536m Xmx1536m XX PermSize 512m XX MaxPermSize 512m
  • 【python】numpy.percentile()函数

    numpy percentile 1 函数 百分位数是统计中使用的度量 表示小于这个值的观察值的百分比 函数numpy percentile 接受以下参数 np percentile a q axis None out None overw
  • android布局矩形只显示一条底线,android – 在布局的绝对中心显示一个矩形框

    您可以使用重量使用线性布局进行调整 我已经粘贴了一个示例代码 希望这会有所帮助 android layout width fill parent android layout height fill parent android orien
  • 【Linux】遍历文件夹

    include
  • 关于图像模式识别的几种分类方法概述

    1 基于概率统计的Bayes分类器 因为在实际分类中由于考虑的侧重点不同或者关心的点不一样导致不能使用同一决策去解决所有的事件的分类 所以需要根据不同的准测函数选择不同的分类决策 基于最小错误率的Bayes决策 基于最小风险的Bayes决策
  • mybatis 分页_Mybatis 分页查询方法

    Mybatis自带的两种分页方法 Mybatis有两种自带分页方法 RowBounds和PageHelper 其中前者是逻辑分页 后者是物理分页 本文后续假设使用myabtis generator生成mapper RowBounds Row
  • 二阶段无法解决的问题

    二阶段无法解决的问题 协调者再发出commit消息之后宕机 而唯一接收到这条消息的参与者同时也宕机了 那么即使协调者通过选举协议产生了新的协调者 这条事务的状态也是不确定的 没人知道事务是否被已经提交 与两阶段提交不同的是 三阶段提交有两个
  • python - 快速搜索指定格式文件的方法

    需求1 快速查找指定文件夹下 所有满足开头为NC 结尾为 nc的文件 root path Users xpji convert kuihua9data 20230621 from pathlib import Path def get fi
  • ES6中Null判断运算符(??)正确打开方式-

    读取对象属性的时候 如果某个属性的值是null或者undefined 有时候需要为它们指定默认值 常见的作法是通过 运算符指定默认值 const headerText response settings headerText Hello w
  • C语言:指针(进阶)

    目录 指针 指针概念 a 什么是地址 b 什么是指针 指针变量 a 指针变量是用来做什么的 b 指针变量的类型怎么理解 和 操作符 a 单目操作符 是什么 b 单目操作符 是什么 二级指针 a 二级指针是什么 指针类型的意义 a 为什么指针