C语言中指针的用法以及相应的作用

目录

什么是指针?

指针的基本操作

(1)变量地址引用:

(2)动态内存分配:

(3)数组和字符串操作:

(4)函数参数传递:

(5)数据结构操作:

(6)NULL指针:

使用指针的好处

1.指针直接访问内存地址:

2.复杂数据结构的实现:

3.函数传参和修改变量值:

4.动态内存分配和释放:

5.直接硬件控制:


当谈论C语言中的指针时,我们进入了一个核心而强大的编程领域。指针是C语言的一个基本概念,它为程序员提供了直接访问内存和执行各种操作的能力。在这篇博客中,我们将深入探讨C语言中指针的用法以及相应的作用。

什么是指针?

在C语言中,指针是一个变量,但它不存储常规值,而存储了一个内存地址。这个内存地址可以指向其他变量或数据结构的位置。指针的本质是一种引用,它允许我们操作内存中的数据,访问变量或者分配动态内存

指针的基本操作

下面我们将介绍C语言中指针的基本操作以及它们的作用:

(1)变量地址引用

指针最基本的作用之一是引用变量的内存地址。这意味着你可以使用指针来获取变量的地址,然后操作该地址上的数据。

  • int a = 42; 
    int *ptr = &a; // ptr存储了变量a的地址
    

这对于数据传递和引用传递非常有用,可以让函数修改调用者的变量值。 

(2)动态内存分配

指针也用于动态内存分配。C语言提供了malloc()calloc()realloc()等函数,用于在运行时分配内存。这是指针的一项强大功能,因为它允许程序在需要时动态分配和释放内存。

int *dynamicArray = (int *)malloc(5 * sizeof(int)); // 动态分配一个整数数组 

free(dynamicArray); // 释放内存以避免内存泄漏

动态内存分配对于处理不确定大小的数据结构非常有用,比如链表和树。

(3)数组和字符串操作

指针经常与数组和字符串一起使用。指针可以用于遍历数组元素或字符串中的字符,也可以用于修改它们。


cchar str[] = "Hello"; 
char *ptr = str; 
while (*ptr != '\0') { 
    printf("%c", *ptr); 
    ptr++; 
}

这对于字符串处理和文本操作非常有用。

(4)函数参数传递

通过将指针作为函数参数,可以传递引用,允许在函数内部修改调用函数中的变量。


void modifyValue(int *x) {
     *x = 20; // 修改x指向的值 
} 

int main() { 
    int num = 10; 
    modifyValue(&num); // 传递num的地址 
    printf("num = %d", num); // num现在的值为20 return 0; 
}

这种引用传递对于在函数之间共享数据非常有用,而不必传递大量数据的拷贝

(5)数据结构操作

在复杂数据结构的实现中,如链表、树或图,指针用于连接和访问不同元素。

struct Node { int data; struct Node *next; };

构建灵活的数据结构,用于各种应用。

(6)NULL指针

指针可以指向NULL,表示指针不指向任何有效的内存地址。这在条件检查和错误处理中非常有用。

int *ptr = NULL; 
if (ptr == NULL) { 
    printf("指针为空");
}

这可以帮助避免悬空指针和访问无效内存地址导致的错误。

请注意,在使用指针时要特别小心。错误的内存访问(如空指针解引用或越界访问)可能导致程序崩溃或未定义的行为。始终确保在使用指针之前为其分配了有效的内存地址,并在使用完毕后及时释放内存。

使用指针的好处

1.指针直接访问内存地址:

指针允许直接访问内存地址,这消除了许多抽象层,提高了访问数据的效率。尤其在需要频繁操作大型数据结构或内存区域时,指针可以显著提高程序的性能。

2.复杂数据结构的实现:

指针是实现复杂数据结构的关键。链表、树、图等数据结构通常使用指针来连接各个元素,实现灵活的数据组织和高效的数据访问。指针允许你在内存中动态分配和连接数据块,这对于管理非连续的数据非常有用。

3.函数传参和修改变量值:

通过传递指针作为函数参数,可以实现引用传递,从而在函数内部修改传递的变量的值。这对于需要函数内部修改外部变量值的情况非常有用。通过传递指针,函数可以修改原始变量,而不是其副本,这允许更复杂的操作。

4.动态内存分配和释放:

指针可以用于动态分配内存,这对于在运行时根据需要分配内存非常有用。你可以使用函数如malloc和free(在C语言中)或new和delete(在C++中)来管理内存。这可以减少内存的浪费并允许更高级别的数据结构。

5.直接硬件控制:

在嵌入式编程和系统级编程中,指针允许直接访问硬件寄存器和内存映射设备,从而实现对底层硬件的精确控制。这是创建操作系统、驱动程序和嵌入式系统的重要工具。

需要注意的是,虽然指针在编程中具有重要作用,但它们也伴随着潜在的问题,如悬空指针、内存泄漏和非法内存访问。因此,在使用指针时需要小心,确保正确地分配和释放内存,以避免潜在的错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/128223.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android Mvp案例解析

目录 后端数据接口数据格式 App客户端布局逻辑主界面布局 M(Model)V(View)P(Presenter)OkhttpRetrofitRxJava网络http请求 Mvp架构-初学者MVP架构的契约者 后端数据接口 接口地址:https://apis.…

STM32——NVIC中断优先级管理分析

文章目录 前言一、中断如何响应?NVIC如何分配优先级?二、NVIC中断优先级管理详解三、问题汇总 前言 个人认为本篇文章是我作总结的最好的一篇,用自己的话总结出来清晰易懂,给小白看也能一眼明了,这就是写博客的意义吧…

平安人寿基于 Apache Doris 统一 OLAP 技术栈实践

导读:平安人寿作为保险行业领军企业,坚持技术创新,以数据业务双轮驱动的理念和更加开放的思路来应对不断增长的数据分析和应用需求;以深挖数据价值、保障业务用数效率为目标持续升级大数据产品体系。自 2022 年起平安人寿开始引入…

芯驰科技出席2023云栖大会,探讨新汽车舱驾融合

10月31日-11月2日,2023云栖大会在杭州成功举办,全场景智能车芯引领者芯驰科技受邀参加斑马智行专场。 芯驰科技资深产品市场总监金辉在「新汽车舱驾融合趋势」研讨会上发表了主题演讲。在随后举办的圆桌论坛上,他和来自智能汽车域控制器、操…

Halcon WPF 开发学习笔记(1):Hello World小程序

文章目录 文章专栏视频链接Hello World训练图片训练目的 开始训练图像预处理导入图像三通道处理调用算子通道选取 滤波什么是好的滤波 增加对比度 区域选取阈值处理算子参数选择运行结果(红色为选择区域) 区域分割运行结果 特征筛选参数代码第二次,面积筛选 画选中十…

【数据在内存中的存储】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 1. 整数在内存中的存储 2. 大小端字节序和字节序判断 2.1 什么是大小端? 2.2 为什么有大小端? 2.3 练习 2.3.1 练习1 2.3.2 练习2 2.3.3 练习3 2.3.4 …

2023长三角G60科创走廊高质量发展要素对接大会举行

11月8日,第六届中国国际进口博览会2023长三角G60科创走廊高质量发展要素对接大会在国家会展中心隆重举行。会上,G60“一廊九城”同向同行、共赴未来,立足“三先走廊”战略定位,围绕“服务‘一带一路’建设,赋能一体化高…

makefile的基础使用

1、建一个目录: mkdir Makefile/makefile(两个任意一个就可以) 2、用vim打开 3、在makefile里面的写法: 目标文件 : 依赖文件 >小例子: test:test.c [tab]依赖关系 gcc -o test test.c 4、…

【计网 传输层概述】 中科大郑烇老师笔记 (十)

目录 0 引言1 概述1.1 传输服务和协议1.2 传输层 vs 网络层1.3 Internet传输层协议 TCP和UDP 2 多路复用、解复用2.1 UDP的多路复用2.2 TCP的多路复用 3 UDP3.1 概述3.2 UDP报文段3.3 拓展:TCP报文段 🙋‍♂️ 作者:海码007📜 专栏…

【中间件篇-Redis缓存数据库03】Redis高级特性和应用(发布 订阅、Stream)

Redis高级特性和应用(发布 订阅、Stream) 发布和订阅 Redis提供了基于“发布/订阅”模式的消息机制,此种模式下,消息发布者和订阅者不进行直接通信,发布者客户端向指定的频道( channel)发布消息,订阅该频道的每个客户端都可以收到该消息。 …

innovus/ICC2:实际绕线层次有低于routing rule min layer的情况如何解决?

ICC2 这是因为routing rule的min layer是soft rule,如果希望min layer严格按照设置的来,还需要手动添加如下命令: set_routing_rule -min_layer_mode hard -rule xx [get_nets xx] innovus 设置route type是加入min_stack_layer选项。 create_route_…

CG Magic分享如何解决Vray渲染器使用不了的问题?

大家在使用Vray渲染器时,经常会有网友反馈说,为什么Vray渲染器使用不了的情况? vray渲染器是安装中出了问题嘛,还是什么原因呢?导致vray渲染器渲染不了。 那么,vray渲染器怎么安装才能正常使用呢&#xff…

Linux学习第39天:Linux I2C 驱动实验(三):哥俩好

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 linux I2C驱动试验整节的思维导图如下: 本节笔记主要学习试验程序的编写及运行测试。其中试验程序的编写主要包括修改设备树、AP3216驱动编写及编写测…

一招解密网络流量瓶颈!

前言 我们曾介绍过观测云提供全面的基础设施监测方案(参见《全方位监控基础设施,坚实守护您的业务稳定!》),能够高效全面地帮助您实时观测所有的基础设施对象及云产品等,赋能您的业务稳定发展。今天我们将…

实在智能入选《2023年中国AI软件市场指南》同年再获Gartner重点推荐

近日,全球权威IT研究与咨询机构Gartner发布2023年《中国AI软件市场指南(Market Guide for AI Software, China, October 2023 )》报告,实在智能依托自研垂直TARS大模型旗下的产品Intelligence Indeed IDP产品在人工智能技术领域的…

【Spring】Spring IOC DI

Spring IOC & DI IOC DI入门什么是Spring什么是容器什么是IOC IOC介绍传统程序开发解决方案 DI IOC详解Bean的存储Controller(控制器存储)Service(服务存储)Repository(仓库存储)Component(组件存储)Configuration(配置存储) 为什么需要这么多类注解类注解之间的关系方法注…

LeetCode 26. 删除有序数组中的重复项 简单

题目 - 点击直达 1. 26. 删除有序数组中的重复项 简单1. 题目详情1. 原题链接2. 题目要求3. 基础框架 2. 解题思路1. 思路分析2. 时间复杂度3. 代码实现 1. 26. 删除有序数组中的重复项 简单 1. 题目详情 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复…

Redis发布订阅

文章目录 前言一、什么是Redis订阅和发布?二、命令三、原理四、使用场景总结 前言 消息队列 Redis 发布订阅(publsub)是一种消息通信模式︰发送者(pub)发送消息,订阅者(sub)接收消息。微信、微博、关注系统! Redis客户端可以订阅任意数量的频道。 一、…

springboot定时服务

上一篇文章【修改定时时间,定时任务及时生效】 是定时任务与功能项目共用一个; 我目前所在公司的定时服务是专门有一个项目处理,然后定时查询库里面的定时信息配置。 话不多说,上程序 数据库设置 create table SCHEDULER_JOB…

基于springboot 手工艺品在线展示系统-计算机毕设 附源码 42553

springboot 手工艺品在线展示系统 目 录 摘要 1 绪论 1.1本课题研究意义 1.2系统开发目的 2 1.3系统开发技术的特色 3 1.4 springboot框架介绍 3 1.5论文结构与章节安排 4 2 手工艺品在线展示系统系统分析 5 2.1 可行性分析 5 2.2 系统流程分析 5 2.2.1数据增加流程 5 2.2.…