【杂谈】浅浅地学学C语言指针

LVGL v8.3 图片显示与解码缓存实战:PNG 上屏、C 数组与文件双方案 LVGL v8.3 图片两种存储方式、PNG/JPG 上屏解码器挂载、LV_IMG_CACHE_DEF_SIZE 缓存调优、手动预解码头像有效性判断,及"缓存被动画清空"真实踩坑。 阅读详情

闲来无事,学学指针

0. 前言

炎热的午后,不想写Java,这准备11月软考嘛,于是随手就抓一本教材来看:好家伙,C语言。

自从干了Java之后,C语言就少接触很多了,但是对比Java和C,总感觉少了些什么。这时,我想起昨天隔壁老王家的狗旺财又去做了绝育,看它回来智慧的眼神,好像感觉自己少了些什么重要的东西…
请添加图片描述

是的,Java比起C确实好像少了指针!很重要的东西。

但其实呢,Java其实也有指针,毕竟指针是不能少的东西,不能说我们平时写Java从来没进行过指针运算,就说它是母的。关于Java的指针,参考文章:
51CTO-Java的指针:https://blog.51cto.com/u_12831/6517911

学习参考文章,自己随便写了个demo:

public static void main(String[] args) {
        Animal a = new Animal();
        System.out.println(a);
}

// 输出
packages.Animal@16f65612

勉强认为这个输出就是这个对象的地址吧。其实是hashcode,只不过Java内部帮我们简化了指针,变成了这种形式。毕竟源码是这样的:

public String toString() {
        return this.getClass().getName() + "@" + Integer.toHexString(this.hashCode());
}

哎等等,好像有点跑题了,咱今天主要学的是C语言不是么,但气氛都到这了,不如今天就学C语言的指针吧!

以上逻辑不通的废话连篇,以下才是正文开始!

参考教程源
优快云-英雄哪里出来:https://blog.youkuaiyun.com/WhereIsHeroFrom?type=lately

1. C语言指针

指针的概念其实我们不陌生,在学校学习《计算机组成原理》的时候就接触过指针的概念:指针即地址。咱们的计算机获取存储器里的数据时,就需要通过寻址(寻找地址)的方式获取。而在高级语言中,地址又叫指针。这就好比“鸡”既叫做“鸡”,又叫做“坤坤”。
坤坤

在C语言中,每个变量都有一个地址,通过这个地址我们可以寻找到该变量。而这个地址的值,可以通过指针变量来存放。

1.1 定义指针

语法格式:

类型 * 变量名

注意,这里的*作用于变量声明,代表这是个指针变量,并不代表乘法的意思!

举例

#include<stdio.h>
int main(){
    int a;
    // 指针变量 p 指向 a, p 是 a 的指针, p 的值等于 a 的地址
    int *p = &a;
    // 输出 a 是否 等于 *p true or false
    printf("%d\n", a == *p);
    return 0;
}

1.2 解引用

C语言中,指针解引用是指通过指针访问其所指向的内存地址处存储的值。
还是使用*来访问指针指向的值,只不过,这次方向变了:

#include <stdio.h>
 int main() {
    int num = 10;
     // 指针ptr指向变量num的内存地址
    int* ptr = &num;  
     // 使用指针解引用操作符获取num的值
     printf("num的值为:%d\n", *ptr);  
     // 修改num的值
     *ptr = 20;  
     printf("修改后的num的值为:%d\n", *ptr);
     // ptr 的值是 num 的内存地址
     printf("ptr的值是 %d\n", ptr);
     return 0;
}

从上面的例子,也说明了解引用操作与指针变量值的区别,一个是操作符*解引用,另一个是指针变量实际的值。

1.3 数组的指针

有了以上指针的概念,结合我们上学时学过的数组知识,我们知道:数组的地址是连续的,数组的第一个元素的地址可以用数组名来表示,因此,对于数组的指针:

#include<stdio.h>
int main(){
    // 演示数组的指针
    int arr[5] = {1, 6, 3, 4, 5};
    // 定义一个指针变量
    int* ptr = arr;
    // 输出数组的第一个元素
    printf("数组的第一个元素为:%d\n", *ptr);
    // 输出数组的第二个元素
    printf("数组的第二个元素为:%d\n", *(ptr + 1));
}

2. C语言指针应用场景

对于个人而言,学习C语言指针主要用于:

  • LeetCode 刷题
  • 软考等考试
  • 拓展知识面

而在GPT的回答中,C语言的指针:

  • 动态内存分配:使用指针可以在运行时动态地分配内存。通过调用 malloc() 、 calloc() 或 realloc() 函数,可以在堆上分配内存,并使用指针来访问和管理这些内存块。
  • 数组操作:指针在C语言中广泛用于数组的操作。指针可以用来遍历数组元素、进行数组元素的读取和修改,以及进行动态数组的创建和释放。
  • 字符串处理:C语言中的字符串实际上是以字符数组的形式存在的。指针可以用来处理和操作字符串,例如查找字符串中的特定字符、拷贝字符串、连接字符串等。
  • 函数传递参数:指针可以作为函数的参数传递,通过传递指针可以在函数内部对变量进行修改,实现对变量的引用传递。
  • 数据结构:指针在实现各种数据结构(如链表、树、图等)时非常有用。通过使用指针,可以在数据结构中连接不同的节点或元素,实现灵活的数据操作。
  • 文件操作:指针在C语言中用于进行文件的读写操作。通过使用 FILE 指针,可以打开文件、读取文件内容、写入文件等。

举例

#include<stdio.h>
int main(){
    // 演示malloc函数
    int* ptr = (int*)malloc(sizeof(int));
    *ptr = 10;
    printf("ptr的值为:%d\n", *ptr);
    free(ptr);

    // malloc函数分配数组
    int* ptr2 = (int*)malloc(5 * sizeof(int));
    for(int i = 0; i < 5; i++){
        ptr2[i] = i + 1;
    }
    for(int i = 0; i < 5; i++){
        printf("ptr2[%d]的值为:%d\n", i, ptr2[i]);
    }
    free(ptr2);
    return 0;
}

3. 总结

本文通过学习C语言的指针,又成功水了一篇文章。

哈哈哈以上纯属玩笑。其实,在学习了一门语言后,再去学习一些其他语言,可以了解到不同语言的一些特性,例如,通过本次指针的学习或回顾,我们可以对比进一步思考:C语言指针的存在使我们与硬件的交互相对更直接,明朗一些。通过看更多的拓展资料,我们发现,当我们使用C语言的指针动态分配内存时,还要考虑使用完毕后的资源释放。而 Java 的指针相对在设计层面弱化,让语法本身更简洁,操作更方便,更有利于一些服务端的开发。

SpringBoot+Vue+MySQL 高校学科竞赛平台 完整可运行版(源码+文档) 本项目基于SpringBoot+Vue+MySQL构建高校学科竞赛管理平台,覆盖学生、教师、领队教师、管理员四大角色,实现竞赛发布、报名、刷题、评分、公示等全流程闭环管理。系统架构清晰,技术主流,配套完整源码、数据库脚本、万字论文、开题报告、答辩PPT及部署文档,支持一键运行,适用于毕业设计、课程设计及院系二次开发,真正实现“开箱即用”。 阅读详情

相关推荐

Halcon深度学习实战:基于异常值检测的工业缺陷精准识别方案

本文详细介绍了Halcon深度学习中的异常值检测技术在工业缺陷识别中的应用。该方法仅需少量正常样本即可训练,能有效应对未知、多变的缺陷类型,显著降低项目启动门槛。文章提供了从数据准备、模型训练、参数调优到产线部署的完整实战指南,并分享了关键的性能优化与避坑经验。

weixin_29042035的博客 243

static 的三种用法:C 语言里一个关键字的三张面孔

本文系统讲解 C 语言中 static 关键字的三种用法:修饰局部变量延长生命周期、修饰全局变量与函数限制作用域到本文件。通过一个包含三个文件的完整工程示例对照演示,并从存储期、作用域与链接性三个属性解释其统一原理,最后补充单元测试框架偏爱 static 函数的工程实践。

大模型全栈工程师 · Thanks_ks 338

【图形学】Loop细分算法及半边结构实现(C++)

文章目录Loop 细分算法介绍增加新顶点更新旧顶点算法实现半边结构半边结构的表示方法半边结构的构造方法创建所有顶点创建所有面及半边半边结构的使用 Loop 细分 顾名思义,网格细分是将粗糙网格精细化的过程,如下动图。Loop细分是众多网格细分算法的一种,Loop细分仅仅对三角形网格模型有效。值得注意的是,虽然叫Loop细分,但是不能理解为“循环”细分,叫这个名字是因为作者的名字是这个而已。 下面是一个粗糙的兔子模型1000个面,进行3次细分 算法介绍 Loop细分算法主要分两步进行 增加新顶点:增加

wk_119的博客 8067

【FDE知识库】(1):AI 编程时代开发语言选型分析,云使用go,企业用java,算法python,底层c

AI 编程时代,开发语言选型需综合考量AI适配度、编译速度、跨平台与学习成本。Python以海量语料和即时执行成首选,适用于AI/ML与原型开发;TypeScript凭借类型系统与秒级构建,成为前端及应用层主流;Go以极速编译与统一风格,契合AI代理高效迭代需求。Rust/C++虽性能强,但编译慢、学习成本高,不适于快速试错。综合推荐:优先选Python、TypeScript、Go,兼顾效率与生态,实现最优AI协作体验。

freewebsys的专栏 592

zynq+LWIP 裸机双网口实现(MIO+EMIO)+程序下载

芯片型号: ZYNQ: XC7Z010clg400开发软件:Vivado2022 + Xilinx Vitis 2022网卡芯片:RTL8211FDI(需要根据网口芯片型号修改对应的硬件配置代码。

thinking in 小宇宙 3410

superpowers-中文使用说明

《obra/superpowers:AI辅助开发的流程纪律工具集》 摘要:obra/superpowers是一套面向AI辅助软件开发的系统化流程规范,包含14个核心技能,强调"先理解后行动"的纪律性开发方法。该工具集定义了从头脑风暴到代码评审的完整工作流,要求严格遵循测试驱动开发、子代理隔离执行等原则。核心特色包括:1) 任何实现前必须完成设计和评审;2) 采用红-绿-重构的TDD循环;3) 复杂任务通过独立子代理串行处理;4) 所有产出需经过双重验证(规格合规+代码质量)。该工具集特别注重文档化和可验证性

qq_22786633的博客 767

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 295

MIKE水动力笔记17_MIKE文件转shp、统计每个单元格的面积

MIKE的工具箱中自带一个转shp的工具,然后可以拖进ArcGIS中很方便的统计每个单元格的面积和每个网格点的水深。

晏长街的博客 4153

信创环境下PageOffice文档控件适配与实践

信创适配做到文档控件这一层,拼的已经不是"有没有国产版本",而是同一个功能在两类终端上是否真的等价。等价的标准很具体:同一次点击能得到同样的结果,同一份公文能得到同样的版式,同一个项目不需要维护两套代码。这背后是三件并不轻松的工作:服务端用一套接口同时支撑两类终端,客户端把两种系统与四种芯片的安装包分发清楚,文档内核层由产品侧跟着 WPS 的版本走。浏览器这一层的压力,则被收进了产品自己的窗口里——升级节奏由产品掌握,不再交给运气。

zi_wu_xian的专栏 326

【工业相机】【深度4】线扫描相机 - 选型实践

前言: 在工业相机的深度应用的前三节里面,针对工业相机的选型、参数、应用计算等做了一些说明。期中,在深度3里面,在说明工业相机在速度场景下的应用的时候,专门开了一节介绍线扫描相机行频速度的计算公式和镜头的选型的大致说明,感觉说的还是不够透彻,切应用举例也不充分,这里特别开一个章节,基于线扫描相机的特点对比面阵相机的特点进行比较详细的说明,尤其对线扫描相机的选型实践,尤其是线扫描相机的分辨率选择计算、行频选择计算进行了充分的说明和计算说明,希望能够给用到线扫描工业相机的同学给予一定的参考: 阐述: 在编

山云的专栏 2万+

解决Google Play签名问题:Android App Bundle上传指南

摘要:本文分享了解决Android App Bundle上传至Google Play时遇到的签名问题的经验。当使用pepk.jar工具加密私钥时,出现"NoSuchAlgorithmException"错误。解决方案包括:确保使用JDK 11+版本、更新pepk.jar工具、验证密钥库信息,并提供详细命令行示例。通过升级开发环境和正确配置签名参数,最终成功生成加密密钥文件。文章为开发者提供了实用的技术参考,强调耐心排查问题的重要性。(149字)

m0_62153576的博客 148

第三篇 第 6 课

前置:第三篇第 1 课(stdx 引入),第二篇第 1 课(std.regex)。环境:仓颉 SDK 1.2.0。本文所有代码与输出均逐行实测。

weixin_41618057的博客 514

DeepCAD: 使用深度自监督学习技术在Python中进行钙成像去噪的全面指南

钙成像是一种用于观察神经活动的技术,通过检测细胞内钙离子的变化来推断神经元的活动。由于其高时空分辨率和对活体组织的适应性,钙成像已经成为神经科学研究中的重要工具。然而,钙成像数据往往伴随着各种噪声,这些噪声可能来自于设备、生物样本或环境。为了获得准确的神经活动信息,去噪是非常关键的。深度自监督学习是一种使用未标记数据进行训练的机器学习方法。与传统的监督学习不同,它不需要大量的标记数据,而是通过学习数据的内部结构和模式来提取有用的特征。DeepCAD是一个基于深度自监督学习的钙成像去噪工具。

qq_38334677的博客 759

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 351

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端

上一篇讲了 MCP 的概念:标准协议、三大角色、M+N 替代 M×N。

nice_lcj520的博客 532

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java 集合容器高频面试题全解:HashMap 树化阈值、1.7 死循环与 ConcurrentHashMap 演进(2026 招聘 JD 真题复盘)

HashMap 树化阈值 8 的泊松分布依据、退化阈值 6 的防抖设计、JDK 1.7 头插成环死循环的排查与修复、1.8 尾插后为何仍线程不安全、ConcurrentHashMap 放弃分段锁的原因与 ForwardingNode 协作扩容、computeIfAbsent 死锁陷阱、大集合找重复的场景题选型,附三层追问链自测。题目来源为 38 期公开招聘 JD 样本与字节、拼多多、建行、美团、快手公开面经。

蒙眼过河 417

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

spdlog 同步日志库使用详解

spdlog是一个轻量级 C++ 日志库,支持同步日志、异步日志、多线程日志、日志文件轮转和自定义日志格式。对于嵌入式 Linux 应用开发,我建议先使用。它可以帮我们完成:日志级别过滤。时间戳和线程 ID 输出。日志格式化。终端和文件输出。多线程安全写入。日志文件按大小或时间轮转。我们不需要自己实现互斥锁、文件写入、日志格式化和轮转等底层功能。

zengjiajun2006的博客 1118

JavaSE通关手册:数据类型与变量

代码无需额外处理,编译时编译器自动完成转换。

xys_678的博客 207

Java 多态 学习笔记

多态是面向对象编程的重要特性,指同一操作作用于不同对象时产生不同行为。其核心在于“父类引用指向子类对象”,结合方法重写实现运行时动态绑定。多态使代码更灵活、可扩展,如用Person p = new Student();统一处理各类人员注册,无需修改调用逻辑。但多态无法直接调用子类特有方法,需通过instanceof判断并强制转换。编译时看左边(类型),运行时看右边(实际对象),实现解耦与维护便利。

AA_AA114514的博客 367

IDEA 简介:从零认识 IntelliJ IDEA

IDEA 全称,是由 JetBrains 公司开发的一款主流 Java 集成开发环境(IDE)。它集代码编辑、编译、调试、测试、版本控制、构建管理等功能于一体,被大量 Java 开发者视为日常开发的首选工具。所谓 IDE(Integrated Development Environment,集成开发环境),就是把写代码所需的各类工具整合到同一个界面中。相比只用文本编辑器加命令行编译,IDE 能显著减少重复操作,让开发者把精力集中在业务逻辑上。

ztI10的博客 173

Java实现批量线段相交检测(跨积判定+扫描线优化与踩坑复盘)

【代码】Java实现批量线段相交检测(跨积判定+扫描线优化与踩坑复盘)

m0_64476639的博客 338

c++ explicit关键字详解

explicit。

拒绝AI文,努力在AI时代写出感动人心的好文章 151

ubuntu安装hadoop系统

本文详细介绍了基于VMware克隆虚拟机搭建三节点Hadoop分布式集群的全过程:使用同一Ubuntu镜像克隆出master、worker1、worker2三台虚拟机,依次配置主机名、固定IP(如192.168.82.10/11/12)、SSH服务及免密登录,确保节点间网络互通。随后安装Java,下载配置Hadoop并分发至各节点,最终初始化启动集群,验证其存储与计算功能,实现高效的大数据环境部署。

qq_43592674的博客 350

TRingBuffer两端都能增删(快递站版)

TRingBuffer 是一个支持两端增删、下标访问且容量动态增长的环形双端队列。它通过无符号索引的永不归零设计,利用减法自动模运算实现空满判断与元素计数,避免了传统环形缓冲浪费格子的问题。内部以票号(索引)标记首尾,扩容时重排元素为连续存储,保证 O(1) 操作与高缓存效率。虽不线程安全,但其高效性使其成为游戏开发中事件队列、命令缓冲等场景的理想选择。

u013768914的博客 301

Mac上装了最新版本的Android Studio,但是没找到jdk的设置选项也没找到jbr的目录

新版Android Studio(2025.3.1+)因三项变更导致常见问题:一、JDK设置移至“DaemonJVM criteria”,新项目默认自动探测或下载JDK;二、JBR目录改名为带版本号的jbr-21等,需进入.app/Contents/查看,或通过About窗口确认运行时;三、命令行缺adb因platform-tools未加入PATH,需在SDK Manager中勾选并配置~/.zshrc中的ANDROID_HOME及PATH。重装或清理残留可解决缺失问题,切勿手动设JAVA_HOME或安装冲

Programming is a highly artistic endeavor 381

Java Arrays.asList 常见坑详解|UnsupportedOperationException、数组联动、基本类型 bug

解析 Arrays.asList 常见开发陷阱,演示 UnsupportedOperationException、底层数组引用共享、基本类型数组问题,区分 Arrays 内部 ArrayList 与 java.util.ArrayList,给出数组转 List 的各种场景正确代码。

weixin_42617033的博客 494
上一篇: 【Java】反射
下一篇: 【Java】注解
CoderSharry
博客等级 码龄4年 515粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值