C语言面试之旅:掌握基础,探索深度(面试实战之c语言指针数组下篇)

        没有什么人能一路单纯到底,但是要记住,别忘了最初的自己。

                                                                                                                                             ----小新

一、引言

        在C语言中,指针是一种特殊的数据类型,它存储的是内存地址。指针在C语言编程中扮演着重要的角色,能够有效地提高程序的效率灵活性。理解并掌握指针的概念和运用对于学习C语言的人来说是至关重要的。

二.关键要点

  1. 内存地址指针存储一个内存地址,该地址指向计算机内存中的某个位置。
  2. 指向指针可以指向内存中的数据,这可以是基本数据类型(如整数、字符)或复杂的数据结构(如数组、结构体)。
  3. 解引用:通过解引用指针,可以访问指针所指向的内存地址上的值。解引用操作使用 * 符号。
  4. 地址运算指针可以进行地址运算,例如指针加法减法,以访问相邻内存位置。
  5. 动态内存分配:指针在动态内存分配中非常有用,允许程序在运行时分配和释放内存,避免静态内存分配的限制。
  6. 传递参数指针允许将变量的地址传递给函数,以便在函数内部修改变量的值。

(1)使用指针的好处

  1. 指针可以动态分配内存
  2. 在链表中可以方便修改链表的节点
  3. 解析字符串
  4. 相同类型的指针可以直接复制

(2)调用Free释放内存后,指针还能用吗

        Free释放掉内存后,只是把内存的使用权就被归还给系统,内存里面的东西可能被清除也可能是垃圾值,但是指向这个内存的指针还是指向这块内存,并不会NULL

(3)指针不能加指针

        指针之间可以做减法,但不能做加法

(4)空指针是指指向地址为0的地方

三、指针的基本概念

(1)指针的定义

        一个指针是一个变量,它存储了另一个变量的内存地址。这个被存储的地址指向了实际的数据值。

int *ptr;  // 定义一个整型指针变量ptr

(2)指针的赋值

        使用"&"运算符获取一个变量的地址,然后将这个地址赋值给一个指针变量。例如,如果我们有一个变量"int num = 10;",我们可以通过"int *ptr = &num"来创建一个指向num的指针。

int num = 10;  
int *ptr = #  // 将ptr指向num的地址

(3)通过指针访问变量

        使用"*"运算符来通过指针访问它所指向的变量。例如,"*ptr"就表示访问ptr所指向的变量

int num = 10;  
int *ptr = #  
printf("%d", *ptr);  // 输出10*,ptr表示访问ptr所指向的变量的值

(4) 指针的指针

int num = 10;  
int *ptr1 = #  
int **ptr2 = &ptr1;  // ptr2是一个指向指针变量的指针变量,它指向ptr1  
printf("%d", **ptr2);  // 输出10**,ptr2表示访问ptr2所指向的指针变量所指向的变量的值

 (5)指针在函数参数传递中的应用

        在C语言中,函数参数传递有两种方式:传值方式传地址方式。传值方式是将变量的值传递给函数,而传地址方式则是将变量的地址传递给函数。传地址方式通常使用指针来实现。

void swap(int *a, int *b) {  int temp = *a;  *a = *b;  *b = temp;  
}  // 通过指针传递变量的地址,实现交换两个变量的值

(6)指针在动态内存分配中的应用

         使用malloc()calloc()realloc()等函数分配内存后,会返回一个指向分配内存的首地址的指针。通过这个指针可以访问和操作这块内存。 

int *ptr = (int*)malloc(sizeof(int));  // 分配一个整型大小的内存空间,并将指针ptr指向该空间的地址  
*ptr = 10;  // 在该空间存储一个整数10  
printf("%d", *ptr);  // 输出10,访问该空间存储的值  
free(ptr);  // 释放该内存空间

四.指针的运用

  1. 函数参数传递:在C语言中,函数参数通常是通过值传递的,这意味着函数会接收到参数的副本。但是,如果我们希望函数能够直接修改原始数据,那么就需要通过指针来实现。例如,如果我们有一个函数"void increment(int *num)",那么这个函数就可以直接修改num的值。
  2. 动态内存分配:C语言中的malloc、calloc和realloc函数返回一个指向分配内存的指针。这些函数允许我们在运行时动态地创建和释放内存,这对于构建复杂的程序结构来说是非常重要的。
  3. 数组操作:在C语言中,数组名实际上就是一个指向数组第一个元素的指针。因此,我们可以使用指针来操作数组,例如通过指针来遍历数组或者修改数组元素的值

五、注意事项

        在使用指针时,我们需要小心确保我们不会访问无效或者未分配内存地址,因为这可能会导致程序崩溃或者未定义的行为。此外,当我们使用完一个动态分配的内存块后,我们需要使用free函数来释放这个内存块,以避免内存泄漏。

六、结论

        指针是C语言的一个重要特性,它提供了一种直接高效的方式来操作内存实现复杂的数据结构。理解并掌握指针的概念和运用,对于提高你的C语言编程技能是至关重要的。同时,正确地使用指针也是避免出现内存问题和程序崩溃的关键。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ArrayList 与 顺序表 (附洗牌算法)!

曾经我也是一枚学霸,直到有一天想去学渣的世界看看,结果就找不到回去的路了。 目录 1. 线性表 2.顺序表 2.1 接口的实现 3. ArrayList简介 4. ArrayList使用 4.1 ArrayList的构造 4.2 ArrayList常见操作 4.3 ArrayList的遍历 4.4 ArrayList的扩…

Redis连接池参数过期策略慢查询日志

目录 bigKey bigKey危害 bigKey优化 连接池参数 删除策略 慢查询日志 redis.config配置 命令配置 showlog命令 bigKey bigKey危害 Redis阻塞,bigKey操作一般耗时久,Redis单线程, 其他客户端会排队等待网络拥堵,bigKey意味着每次获取需要很大流量, 假设单条数据1MB,并发…

[在不同进制下的长除法] 正整数的任意进制转换

正整数的任意进制转换 题目描述 将 p 进制 n 转换为 q 进制。p 和 q 的取值范围为【2,36】,其中,用到的数码按从小到大依次为:0,1,2,3,4,5,6,7&…

Flutter PK jetpack compose区别和选择

Flutter诞生于Chrome团队,是一帮做Web的开发做的跨平台框架,从最开始的设计初衷,就是指向了跨平台这条路,而Compose,则是诞生于Android团队,是为了解决当前View的架构体系不能再继续适应申明式编程的范式而…

使用drawio图表,在团队中,做计划,设计和跟踪项目

使用drawio图表,在团队中,做计划,设计和跟踪项目 drawio是一款强大的图表绘制软件,支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用,则直接输入网址draw.io或者使用drawon(桌案), drawon.cn内部…

Redis中分布式锁的使用

在分布式系统中,如果使用JVM中的同步锁在高并发的场景下仍然会产生线程安全问题。首先我们来查看在多个服务器时为什么会产生线程安全问题,有这样一个案例,有一件商品购买规则为一个用户只能购买一次,如果使用同步锁锁住用户id&am…

AR助推制造业智能转型:实时远程协作与可视化引领生产创新

制造商面临着多方面的变革,技术的兴起催生了工业物联网(IIoT),改变了现代工厂的外貌、系统和流程。同时,全球竞争压力和不断变化的员工队伍要求采用新的员工培训方法,并重新审视工人在工厂中的角色。尽管如…

Linux(13):例行性工作排程

例行性工程 听谓的排程是将工作安排执行的流程之意。 Linux 排程就是透过 crontab 与 at 这两个东西。 两种工作排程的方式: 一种是例行性的,就是每隔一定的周期要来办的事项; 一种是突发性的,就是这次做完以后就没有的那一种&a…

【算法】希尔排序

目录 1. 说明2. 举个例子3. java代码示例4. java示例截图 1. 说明 1.希尔排序是直接插入排序的一种改进,其本质是一种分组插入排序 2.希尔排序采取了分组排序的方式 3.把待排序的数据元素序列按一定间隔进行分组,然后对每个分组进行直接插入排序 4.随着间…

QWebChannel 是 Qt 框架中用于在 Web 页面和 Qt 应用程序之间进行通信的类

QWebChannel 是 Qt 框架中用于在 Web 页面和 Qt 应用程序之间进行通信的类。 QWebChannel 类提供了一种机制,使得 Web 页面可以与 Qt 应用程序进行双向通信。通过 QWebChannel,可以将 Qt 应用程序中的对象暴露给 Web 页面,并通过信号和槽机制…

大型语言模型在实体关系提取中的应用探索

如今LLM(大语言模型)的问答与生成能力已被大家所熟知,很多用户已经亲身体会到了LLM为工作、生活带来的变革。其实,作为NLP(自然语言处理)的集大成者,LLM能为我们提供的能力不限于此。其基本胜任传统NLP技术所能承担的所有任务。如&#xff1a…

[开题报告]基于SpringBoot的艾滋病科普平台的设计与实现

1.选题背景 艾滋病(艾滋病毒感染与免疫缺陷综合征)是一种严重的传染病,对人类的健康和社会稳定造成了极大的影响。全球范围内,艾滋病已经成为公共卫生领域的重大挑战之一。尽管在科学研究和医疗技术方面取得了一定进展&#xff0…

设置随机种子保证网络可复现性

原文链接:https://zhuanlan.zhihu.com/p/141063432 为什么使用相同的网络结构,跑出来的效果完全不同,用的学习率,迭代次数,batch size 都是一样?固定随机数种子是非常重要的。但是如果你使用的是PyTorch等…

MySQL 8创建数据库、数据表、插入数据并且查询数据

我使用的数据库是MySQL 8。 创建数据库 create database Bookbought; -- 创建数据库Bookbought use Bookbought; -- 使用数据库Bookbought创建数据表 创建用户表bookuser。 create table ## 往allbook里边插入数据(id INT PRIMARY KEY AUTO_INCREMENT, -- id 为 主键userna…

CCKS2023-面向上市公司主营业务的实体链接评测-亚军方案

赛题分析 大赛地址 https://tianchi.aliyun.com/competition/entrance/532097/information 任务描述 本次任务主要针对上市公司的主营业务进行产品实体链接。需要获得主营业务中的产品实体,将该实体链接到产品数据库中的某一个标准产品实体。产品数据库将发布在竞赛…

机器学习决策树ID3算法

1、先去计算总的信息量 2、根据不同指标分别计算对应的信息增益 3、根据算出的信息增益来选择信息增益最大的作为根结点 4、天气中选择一个继续上述过程 5、决策树划分结束

MySQL索引优化实战二

分页查询优化 很多时候我们业务中实现分页功能时可能会用如下SQL来实现: select * from employees LIMIT 10000,10表示从表中中区从10001行开始的10行记录,看似只查了10条记录,但是这条SQL是先读取10010条记录,然后抛弃前10000条…

Spring事务管理介绍

文章目录 Spring事务管理1 Spring事务简介【重点】问题导入1.1 Spring事务作用1.2 需求和分析1.3 代码实现【前置工作】环境准备【第一步】在业务层接口上添加Spring事务管理【第二步】设置事务管理器(将事务管理器添加到IOC容器中)【第三步】开启注解式事务驱动【第四步】运行…

智能优化算法应用:基于黄金正弦算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于黄金正弦算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于黄金正弦算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.黄金正弦算法4.实验参数设定5.算法结果6.参考…

STM32的HAL库串口编程

STM32的串口轮询 1. 一天的努力2. 问题3. 中断接收4. 还没有结束1. 一天的努力 今天努力了一天,用STM32CubeIDE为STM32F103C8T6进行编程。遇到了串口麻烦。发送数据非常正常。接收数据碰到了问题,在这里写下来供初学者共勉。 2. 问题 轮询读取。在主程序中添加下面的代码:…