当前位置: 首页 > news >正文

【重拾C语言】七、指针(一)指针与变量、指针操作、指向指针的指针

目录

前言

七、指针

7.1 指针与变量

7.1.1 指针类型和指针变量

7.1.2 指针所指变量

7.1.3 空指针、无效指针

7.2 指针操作

7.2.1 指针的算术运算

7.2.2 指针的比较

7.2.3 指针的递增和递减

7.3 指向指针的指针


前言

  • 指针是C语言中一个重要的概念
  • 正确灵活运用指针
    • 可有效地表示和使用复杂的数据结构
    • 可动态分配内存空间,节省程序运行空间,提高运行效率
  • 不正确理解和使用指针,指针将是程序中最危险的成分,由此带来的后果可能是无法估量的

七、指针

7.1 指针与变量

7.1.1 指针类型和指针变量

        指针类型指定了指针所指向的变量的数据类型。例如,int*是指向整数(int)类型的指针。指针变量是一个存储了内存地址值的变量,可以使用指针变量来存储、操作和访问内存中的数据。

#include <stdio.h>int main() {int num = 10; // 定义一个整数变量int* ptr; // 定义一个指向整数的指针变量ptr = &num; // 将指针指向num变量的地址printf("num 的值:%d\n", num);printf("指针所指向的变量的值:%d\n", *ptr);return 0;
}

  • C语言中的指针定义符是*,它用于声明一个指针变量。指针变量用来存储内存地址,可以指向其他变量或数据结构。例如,int *ptr;声明了一个指向整数的指针变量。
  • 间接引用运算符也称为解引用运算符,用于访问指针所指向的变量或数据。在C语言中,间接引用运算符使用*符号。通过将间接引用运算符应用于指针变量,可以获取该指针指向的实际值。例如,如果ptr是一个指向整数的指针变量,那么*ptr将给出该指针指向的整数的值。

7.1.2 指针所指变量

        通过指针,我们可以访问指针所指向的变量。使用解引用运算符(*)可以获取指针所指向的变量的值。

#include <stdio.h>int main() {int num = 10;int* ptr = &num;printf("通过指针访问变量的值:%d\n", *ptr);*ptr = 20; // 修改指针所指向的变量的值printf("修改后的变量的值:%d\n", num);return 0;
}

7.1.3 空指针、无效指针

        空指针是指未指向任何有效地址的指针。在C语言中,可以使用NULL宏来表示空指针。

#include <stdio.h>int main() {int* ptr = NULL; // 声明一个空指针if (ptr == NULL) {printf("指针是空指针\n");} else {printf("指针不是空指针\n");}return 0;
}

  •  有时可能不小心生成无效指针 (Invalid  Pointer)
    • 无效指针是指一个指针变量无值,它既没有指向确定的变量或函数,也不是NULL。
    • 程序中存在无效指针,不是好的程序设计风格
    • 产生无效指针的原因很多,例如
      • 说明指针变量后还没有给它赋值
      • 指针被定义后,必须将指针和一个特定的变量进行关联后,才可以使用指针,即必须先赋值再使用
      • 把整型变量转换成指针;
      • 回收为指针所指对象分配存储空间;
        • float *p; 
          p=(float *)malloc(sizeof(float));
          ……
          free(p);

      • 指针运算超出数组范围。
  • NULL是C指针类型的一个特殊值,在系统文件stdio.h中定义,其值为0,称为“空”
  • 表示指针变量的值为空,不指向任何变量或函数
  • NULL值属于所有指针类型。判断指针变量iptr的值是否为空可以使用
    • iptr != NULL或iptr == NULL
      iptr != 0
  • 保证指针在没有指向有效对象时,取值为NULL是一种良好的编程风格

7.2 指针操作

        指针操作是指对指针进行一些特定的运算或操作,用于操作指针所指向的内存位置。在C语言中,指针操作包括指针的算术运算、指针的比较和指针的递增/递减等。

7.2.1 指针的算术运算

  • 指针的加法运算:可以将指针与一个整数相加,结果是指针指向的内存地址增加了若干个字节。这对于遍历数组或访问连续内存块非常有用。
  • 指针的减法运算:可以将一个指针减去另一个指针,结果是两个指针之间的距离(以字节为单位)。
#include <stdio.h>int main() {int arr[] = {1, 2, 3, 4, 5};int* ptr = arr;printf("第一个元素:%d\n", *ptr);// 指针加法运算ptr = ptr + 1;printf("第二个元素:%d\n", *ptr);// 指针减法运算ptr = ptr - 1;printf("回到第一个元素:%d\n", *ptr);return 0;
}

7.2.2 指针的比较

        可以对两个指针进行比较运算,包括相等比较(==)、不等比较(!=)、大于比较(>)、小于比较(<)、大于等于比较(>=)和小于等于比较(<=)。

#include <stdio.h>int main() {int arr[] = {1, 2, 3, 4, 5};int* ptr1 = &arr[0];int* ptr2 = &arr[2];if (ptr1 == ptr2) {printf("指针相等\n");} else {printf("指针不相等\n");}if (ptr1 < ptr2) {printf("ptr1 指向的元素在 ptr2 指向的元素之前\n");} else {printf("ptr1 指向的元素在 ptr2 指向的元素之后\n");}return 0;
}

7.2.3 指针的递增和递减

        指针可以通过递增(++)和递减(--)运算符来移动到下一个或上一个内存位置,移动的距离取决于指针所指向的数据类型。

#include <stdio.h>int main() {int arr[] = {1, 2, 3, 4, 5};int* ptr = arr;printf("第一个元素:%d\n", *ptr);// 指针递增ptr++;printf("下一个元素:%d\n", *ptr);// 指针递减ptr--;printf("回到第一个元素:%d\n", *ptr);return 0;
}

7.3 指向指针的指针

        C语言支持指向指针的指针,也称为多级指针。指向指针的指针存储了一个指向指针变量的地址,通过多级指针可以访问多级间接引用的内存。

#include <stdio.h>int main() {int num = 10;int* ptr = &num;int** ptr2 = &ptr;printf("num 的值:%d\n", num);printf("指针所指向的变量的值:%d\n", *ptr);printf("指向指针的指针所指向的变量的值:%d\n", **ptr2);return 0;
}

相关文章:

【重拾C语言】七、指针(一)指针与变量、指针操作、指向指针的指针

目录 前言 七、指针 7.1 指针与变量 7.1.1 指针类型和指针变量 7.1.2 指针所指变量 7.1.3 空指针、无效指针 7.2 指针操作 7.2.1 指针的算术运算 7.2.2 指针的比较 7.2.3 指针的递增和递减 7.3 指向指针的指针 前言 指针是C语言中一个重要的概念正确灵活运用指针 可…...

Kafka源码简要分析

目录 一、生产者的初始化流程 二、生产者到缓冲队列的流程 三、Sender拉取数据到Kafka流程 四、消费者初始化 五、主题订阅原理 六、消费者抓取数据原理 七、消费者组初始化 八、消费者组消费流程 九、提交offset原理 一、生产者的初始化流程 首先获取事务id和客户端…...

react 按住ctrl键,点击时会出现菜单的问题修复

问题描述&#xff1a;我需要按住crtl键&#xff0c;然后鼠标点击后做一些逻辑操作&#xff0c;但是出现如下问题 问题一&#xff1a;按住ctrl键后&#xff0c;点击时不触发click事件&#xff0c;只触发 mousedown和mouseup事件。 问题二&#xff1a;按住ctrl键点击时出现菜单…...

【虚拟机栈】

文章目录 1. 虚拟机栈概述2. 局部变量表(Local Variables)3. 操作数栈4. 动态链接4.1 方法的调用&#xff1a;解析与分配 5. 方法返回地址6. 栈的相关面试题 1. 虚拟机栈概述 每个线程在创建时都会创建一个虚拟机栈&#xff0c;其内部保存一个个的栈帧&#xff08;Stack Frame…...

Linux系列讲解 —— 【fsck】检查并修复Linux文件系统

当文件系统出现损坏时&#xff0c;例如文件无法查看&#xff0c;删除等&#xff0c;可以使用 fsck&#xff08;File System Consistency Check&#xff09;进行修复。但是需要注意fsck在修复时&#xff0c;如果检查出某个文件有问题&#xff0c;可能会向用户请求删除。所以&…...

gitlab突然提示我要输入密码了。

用了很长时间的一个gitlab库&#xff0c;今天提交代码的时候突然提示我输入密码了&#xff0c;并且用户还是gitxx.xx.xx.xx的&#xff0c;瞬间懵逼。 想想原因&#xff0c;可能是因为我不久前设置了本地对另外一个git库的远程访问&#xff0c;用的是ssh&#xff0c;操作过程中可…...

业务测试常见问题(一)

如何多维度的分析一个需求&#xff1f; 功能维度&#xff1a;需求中所描述的功能是否实现&#xff0c;与用户的需求是否一致&#xff0c;是否完整符合用户的需求等。 安全性维度&#xff1a;是否有安全漏洞&#xff0c;是否存在未授权访问漏洞等&#xff0c;以保证系统的安全性…...

IntelliJ IDEA失焦自动重启服务的解决方法

IDEA 热部署特性 热部署&#xff0c;即应用正属于运行状态时&#xff0c;我们对应用源码进行了修改更新&#xff0c;在不重新启动应用的情况下&#xff0c;可以能够自动的把更新的内容重新进行编译并部署到服务器上&#xff0c;使修改立即生效。 现象 在使用 IntelliJ IDEA运…...

终端准入控制系统,保障企业内网安全的关键防线

随着网络技术的不断发展&#xff0c;企业面临的安全威胁也越来越多。终端作为承载企业业务的媒介&#xff0c;对内网资产安全有着重要影响。确保内网终端&#xff08;如PC、BYOD、IoT等&#xff09;能够得到统一管理&#xff0c;对保护内网安全很有必要。终端准入控制作为一种有…...

mysql-执行计划

1. 执行计划表概述 id相同表示加载表的顺序是从上到下。 id不同id值越大&#xff0c;优先级越高&#xff0c;越先被执行。id有相同&#xff0c;也有不同&#xff0c;同时存在。 id相同的可以认为是一组&#xff0c;从上往下顺序执行&#xff1b;在所有的组中&#xff0c;id的值…...

金蝶云星空和旺店通·企业奇门接口打通对接实战

金蝶云星空和旺店通企业奇门接口打通对接实战 接入系统&#xff1a;金蝶云星空 金蝶K/3Cloud&#xff08;金蝶云星空&#xff09;是移动互联网时代的新型ERP&#xff0c;是基于WEB2.0与云技术的新时代企业管理服务平台。金蝶K/3Cloud围绕着“生态、人人、体验”&#xff0c;旨在…...

在服务器上使用nginx改变前端项目请求的url

location /app-dev {rewrite ^/app-dev/(.*) /$1 break;proxy_pass http://152.136.36.251:9999;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr; } location /请求后缀 { rewrite ^/app-dev/(.*) /$1 break; proxy_pass 想要的请求后端的url; …...

【学习笔记】莫比乌斯反演

退役OIer回来受虐啦 一些定义 μ ( x ) { 1 x > 1 ( − 1 ) n x ∏ i 1 n P i 0 o t h e r w i s e \mu(x) \begin{cases} 1 & x > 1 \\ (-1)^n & x \prod _ {i1} ^ {n} P_{i}\\ 0 & otherwise \end{cases} μ(x)⎩ ⎨ ⎧​1(−1)n0​x>1x∏i1n​Pi…...

一款构建Python命令行应用的开源库

1 简介 当我们编写 Python 程序时&#xff0c;我们经常需要与用户进行交互&#xff0c;接收输入并输出结果。Python 提供了许多方法来实现这一点&#xff0c;其中一个非常方便的方法是使用 typer 库。typer 是一个用于构建命令行应用程序的 Python 库&#xff0c;它使得创建命令…...

10-Node.js模块化

01.模块化简介 目标 了解模块化概念和好处&#xff0c;以及 CommonJS 标准语法导出和导入 讲解 在 Node.js 中每个文件都被当做是一个独立的模块&#xff0c;模块内定义的变量和函数都是独立作用域的&#xff0c;因为 Node.js 在执行模块代码时&#xff0c;将使用如下所示的…...

数字IC前端学习笔记:数字乘法器的优化设计(Dadda Tree乘法器)

相关阅读 数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482 华莱士树仍然是一种比较规则的结构&#xff08;这使得可以方便地生成树的结构&#xff09;&#xff0c;这导致了它所使用的全加器和半加器个数不是最少的&#xff…...

计算机专业毕业设计项目推荐14-文档编辑平台(SpringBoot+Vue+Mysql)

文档编辑平台&#xff08;SpringBootVueMysql&#xff09; **介绍****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设计流程以及模式&#xff0c;在编写的…...

【读书后台管理系统】—后端框架搭建(二)

【读书后台管理系统】—后端框架搭建&#xff08;二&#xff09; 一、 Node 简介 Node 是一个基于 V8 引擎的 Javascript 运行环境&#xff0c;它使得 Javascript 可以运行在服务端&#xff0c;直接与操作系统进行交互&#xff0c;与文件控制、网络交互、进程控制等 Chrome …...

【DLoopDetector(C++)】DBow2词袋模型loop close学习

0.前言 最近读了两篇论文&#xff0c;论文作者开源了一种基于词袋模型DBoW2库的DLoopDetector算法&#xff0c;自己运行demo测试一下 对应论文介绍&#xff1a;Bags of Binary Words for Fast Place Recognition in Image Sequences 开源项目Github地址&#xff1a;https://gi…...

什么是CAS机制?

CAS和Synchronized的区别是什么&#xff1f;适合什么样的场景&#xff1f;有什么样的优点和缺点&#xff1f; 示例程序&#xff1a;启动两个线程&#xff0c;每个线程中让静态变量count循环累加100次。 public class ThreadTest {private static int count 0;public static …...

英雄联盟自动化助手:提升游戏效率的全方位解决方案

英雄联盟自动化助手&#xff1a;提升游戏效率的全方位解决方案 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League Akari作为一…...

提升开发效率:Android Studio零障碍IDE本地化配置指南

提升开发效率&#xff1a;Android Studio零障碍IDE本地化配置指南 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 开发人员在使用…...

douyin-downloader:3大核心能力破解抖音内容高效下载难题

douyin-downloader&#xff1a;3大核心能力破解抖音内容高效下载难题 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback su…...

从电子管到全固态:中波广播发射机核心技术演进与选型指南

1. 中波广播发射机的前世今生 第一次见到中波发射机是在十年前参观某省级广播电台时&#xff0c;那座两层楼高的电子管设备让我印象深刻——嗡嗡作响的风扇、散发着热量的金属外壳、闪烁着微光的电子管&#xff0c;活像科幻电影里的场景。如今这种"大家伙"已经逐渐被…...

PNAS|收入不足对婴儿早期脑发育的影响

本文揭示了逆境在出生后最早期脑发育阶段中的关键作用。基于 Baby Steps 研究&#xff08;一项正在进行的纵向研究&#xff1b;在一所服务于贫困与压力发生率较高家庭的初级保健门诊中采集婴儿脑电&#xff08;EEG&#xff09;与社会经济地位相关数据&#xff09;的数据表明&am…...

开源小模型也能干大事:MinerU图文理解实战教程

开源小模型也能干大事&#xff1a;MinerU图文理解实战教程 1. 项目简介 OpenDataLab MinerU 是一个专门针对文档理解设计的智能多模态模型&#xff0c;基于 OpenDataLab/MinerU2.5-1.2B 模型构建。虽然只有 1.2B 参数&#xff0c;但这个模型在文档解析方面表现出色&#xff0…...

5分钟搞定!Clipy剪贴板管理神器让Mac效率翻倍

5分钟搞定&#xff01;Clipy剪贴板管理神器让Mac效率翻倍 【免费下载链接】Clipy Clipboard extension app for macOS. 项目地址: https://gitcode.com/gh_mirrors/cl/Clipy 还在为macOS只能记住最后一次复制内容而烦恼吗&#xff1f;Clipy是一款专为Mac用户设计的剪贴板…...

FUTURE POLICE语音模型重装系统后快速恢复部署指南

FUTURE POLICE语音模型重装系统后快速恢复部署指南 重装系统这事儿&#xff0c;对开发者来说&#xff0c;有时候就跟电脑的“大扫除”一样&#xff0c;图个干净利落。但扫除完&#xff0c;看着空空如也的桌面和命令行&#xff0c;要重新把那些吃饭的家伙——比如你正在跑的FUT…...

Qwen1.5-0.5B-Chat实战部署:Docker容器化改造方案

Qwen1.5-0.5B-Chat实战部署&#xff1a;Docker容器化改造方案 本文介绍如何将基于ModelScope的Qwen1.5-0.5B-Chat对话服务进行Docker容器化改造&#xff0c;实现一键部署和跨平台运行。 1. 项目概述与核心价值 Qwen1.5-0.5B-Chat是阿里通义千问开源系列中最轻量的对话模型&…...

LFM2.5-1.2B-Thinking-GGUF部署教程:解决‘返回为空’问题的max_tokens调优策略

LFM2.5-1.2B-Thinking-GGUF部署教程&#xff1a;解决返回为空问题的max_tokens调优策略 1. 模型简介与部署准备 LFM2.5-1.2B-Thinking-GGUF是Liquid AI推出的轻量级文本生成模型&#xff0c;特别适合在资源有限的环境中快速部署使用。这个模型采用GGUF格式和llama.cpp运行时&…...