c语言指针详解(上)

目录
一、指针的基本概念和用法
二、指针运算
2.1 指针的自增和自减运算
2.2 指针的自增和自减运算
三、数组和指针
四、指针和函数
4.1 在函数中使用指针作为参数和返回值
4.1.1 使用指针作为函数参数
4.1.2 使用指针作为函数返回值
4.2 指针参数的传值和传引用特性
4.2.1 指针参数的传值特性
4.2.2 指针参数的传引用特性
🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。
🎁欢迎大家给我点赞👍、收藏⭐️,并在留言区📝与我互动,这些都是我前进的动力!
🌟我的格言:森林草木都有自己认为对的角度🌟。

一、指针的基本概念和用法
在 C 语言中,指针是一个变量,用来存储一个地址,这个地址指向内存中的另外一个变量。可以通过指针来访问或修改这个变量的值。
使用 * 运算符可以访问指针所指向的变量的值。
使用 & 运算符可以获取变量的地址。
下面是一个使用指针访问变量地址和值的示例代码:
#include <stdio.h>int main() {int num = 42; // 定义一个整数变量 num 并初始化为 42int *ptr = # // 定义一个指针变量 ptr 并将其初始化为 num 的地址printf("num 的地址是:%p\n", &num);printf("ptr 所指向的地址是:%p\n", ptr);printf("ptr 所指向的值是:%d\n", *ptr);return 0;
}
输出结果如下:

在上面的示例代码中,我们首先定义了一个整型变量 num 并初始化赋值为 42,然后定义一个整型指针变量 ptr ,并使用 & 运算符取 num 变量的地址初始化 ptr 指向 num 变量的地址。接着我们通过 printf 函数输出 num 变量的地址和 ptr 指向的地址,最后输出通过 *ptr 来访问 ptr 指向的变量 num 的值。
二、指针运算
2.1 指针的自增和自减运算
自增和自减运算仅适用于指向数组、字符串或分配内存的指针。
自增运算符
++让指针指向下一个内存单元,即指针变量的值加上所指向的变量类型占用的字节数。自减运算符
--让指针指向前一个内存单元,即指针变量的值减去所指向的变量类型占用的字节数。
示例代码:
#include <stdio.h>int main() {int arr[5] = {1, 2, 3, 4, 5};int *p = &arr[0]; // 指向数组 arr 的第一个元素的指针printf("当前指针 p 的值为: %p\n", p);p++; // 指针自增操作printf("执行 p++ 后,p 指向的值为: %d\n", *p);p--; // 指针自减操作printf("执行 p-- 后,p 指向的值为: %d\n", *p);return 0;
}
输出结果如下:

这段代码中,我们定义了一个包含 5 个整型元素的数组 arr,并定义一个指向数组第一个元素的指针 p。通过执行 p++ 和 p-- 操作,指针 p 的值发生了变化,指向了数组中不同的元素,从而可以访问数组中不同的数据。
2.2 指针的自增和自减运算
加法和减法运算可以应用于指向数组或分配内存的指针。如果对指针进行加法或减法运算,会根据指针所指向类型的字节大小来确定位移量。
指针的加法运算(+)将指针的值增加多个字节数。
指针的减法运算(-)将指针的值减去多个字节数。
示例代码:
#include <stdio.h>int main() {int arr[] = {1, 2, 3, 4, 5};int *p = &arr[2]; // 指向数组 arr 的第三个元素的指针printf("当前指针 p 的值为: %p\n", p);p = p + 1; // 指针加法操作printf("执行 p + 1 后,p 指向的值为: %d\n", *p);p = p - 2; // 指针减法操作printf("执行 p - 2 后,p 指向的值为: %d\n", *p);return 0;
}
输出结果如下:

在这个示例中,我们定义了一个数组 arr,并将指针 p 初始化为指向数组 arr 的第三个元素。通过执行 p + 1 和 p - 2 操作,指针 p 的值发生了相应的变化,通过访问指针 p 所指向的值,我们可以看到指针指向了数组中不同的元素。
三、数组和指针
数组名本身就是指向数组头部的指针。
例如,如果有一个 int 类型的数组 arr,那么在代码中使用 arr 和 &arr[0] 是等效的,在内存中它们所指向的都是数组的第一个元素。
示例代码:
#include <stdio.h>int main() {int arr[] = {1, 2, 3, 4, 5};int *p = arr; // 指向数组 arr 的第一个元素的指针printf("通过数组名访问数组的第一个元素:%d\n", arr[0]);printf("通过指针访问数组的第二个元素:%d\n", *(p + 1));printf("通过指针访问数组的第三个元素:%d\n", p[2]);return 0;
}
输出结果如下:

四、指针和函数
4.1 在函数中使用指针作为参数和返回值
4.1.1 使用指针作为函数参数
可以通过将指针作为函数的参数来传递数据。这样可以实现在函数内部修改传递给函数的变量的值,因为指针传递的是变量的地址。
示例代码:
#include <stdio.h>void changeValue(int *ptr) {*ptr = 10; // 修改指针指向的变量的值
}int main() {int num = 5;printf("函数调用前的值:%d\n", num);changeValue(&num); // 传递变量的地址printf("函数调用后的值:%d\n", num);return 0;
}
输出结果如下:

在这个示例中,我们在 changeValue 函数中使用了一个指针参数 ptr,通过 *ptr 修改了变量 num 的值。在 main 函数中将 num 的地址传递给 changeValue 函数来实现修改 num 的值。
4.1.2 使用指针作为函数返回值
可以使用指针作为函数的返回值,以便将函数内部的计算结果返回给调用函数。
示例代码:
#include <stdio.h>
#include <stdlib.h> // 包含 malloc 和 free 函数int* createArray(int size) {int *arr = (int*)malloc(size * sizeof(int)); // 动态分配内存,并强制类型转换for (int i = 0; i < size; i++) {arr[i] = i + 1;}return arr;
}int main() {int size = 5;int *array = createArray(size); // 函数返回指针for (int i = 0; i < size; i++) {printf("%d ", array[i]);}free(array); // 释放内存return 0;
}
输出结果如下:
![]()
在这个示例中,createArray 函数根据传入的参数 size 动态分配了一个整型数组,并将数组的首地址作为指针返回给调用函数。在 main 函数中,我们通过调用 createArray 函数来获取数组的地址,并使用指针 array 访问和输出数组的元素。最后,释放动态分配的内存。
4.2 指针参数的传值和传引用特性
4.2.1 指针参数的传值特性
当将指针作为函数参数进行传递时,实际上传递的是指针变量的值(即地址)。这意味着函数内部对指针本身的修改不会影响到调用该函数的代码。
示例代码:
#include <stdio.h>void changePointer(int *ptr) {int dummy = 10;ptr = &dummy; // 修改指针的值
}int main() {int num = 5;int *ptr = #printf("函数调用前的指针:%p\n", ptr);changePointer(ptr);printf("函数调用后的指针:%p\n", ptr);return 0;
}
输出结果如下:

在这个示例中,changePointer 函数尝试将指针 ptr 指向一个新的变量 dummy,但是在函数外部输出指针 ptr 的值时并未改变,验证了指针参数的传值特性。
4.2.2 指针参数的传引用特性
通过使用指针的指针或者指针的引用,可以实现对指针的引用传递,从而在函数内部对指针进行修改可以影响到调用该函数的代码。
示例代码:
#include <stdio.h>void changePointer(int **ptr) {int dummy = 10;*ptr = &dummy; // 修改指针指向的地址
}int main() {int num = 5;int *ptr = #printf("函数调用前的指针:%p\n", ptr);changePointer(&ptr);printf("函数调用后的指针:%p\n", ptr);return 0;
}
输出结果如下:

在这个示例中,我们将指针 ptr 的地址传递给 changePointer 函数,并在函数内部修改了指针 ptr 的值为新的变量 dummy 的地址。在函数外部输出指针 ptr 的值时发现已经改变,验证了指针参数的传引用特性。
相关文章:
c语言指针详解(上)
目录 一、指针的基本概念和用法 二、指针运算 2.1 指针的自增和自减运算 2.2 指针的自增和自减运算 三、数组和指针 四、指针和函数 4.1 在函数中使用指针作为参数和返回值 4.1.1 使用指针作为函数参数 4.1.2 使用指针作为函数返回值 4.2 指针参数的传值和传引用特性 4.2.1 指针…...
如何删除mac苹果电脑上面的流氓软件?
在使用苹果电脑的过程中,有时候我们也会遇到一些不需要的软件。无论是因为不再需要,或者是为了释放磁盘空间,删除这些软件是很重要的。本文将为大家介绍怎样删除苹果电脑上的软件! CleanMyMac X全新版下载如下: https://wm.make…...
WordPress(11)给文章添加预计阅读时长
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、文件配置二、代码块1.引入库2.配置 single.php三、效果图前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了…...
周周爱学习之快速排序
快速排序,顾名思义,快速排序是一种速度非常快的一种排序算法 平均时间复杂度为O(),最坏时间复杂度为O()数据量较大时,优势非常明显属于不稳定排序 1.算法描述 每一轮排序选择一个基准点(pivot)进行分区 让小于基准点…...
国产接口测试工具APIpost
说实话,了解APIpost是因为,我的所有接口相关的文章下,都有该APIpost水军的评论,无非就是APIpost是中文版的postman,有多么多么好用,虽然咱也还不是什么啥网红,但是不知会一声就乱在评论区打广告…...
MySQL电商管理系统练习题及答案
一 、表结构 用户表(user):id(主键)、username、password、email、phone、age商品表(product):id(主键)、name、price、stock、description订单表(order):id(主键)、user_id(外键,关联用户表)、total_price、status、create_time…...
每日3道PWN(第二天)
ciscn_2019_n_1 参考: [BUUCTF-pwn]——ciscn_2019_n_1-CSDN博客 [BUUCTF]PWN5——ciscn_2019_n_1_ciscn_2019_n_4-CSDN博客 BUUCTF—ciscn_2019_n_1 1-CSDN博客 checksec一下 64位栈溢出 按f5查看main函数,双击可疑函数 发现含有命令执行的且发现fl…...
SAP STMS传输请求
一、概述 一般SAP项目上都会有六套系统,分别是: 测试环境-DEV系统 主要由100:沙盘系统:用于业务顾问配置 200:开发系统:用于开发ABAP写代码 300:测试系统:主要是单元测试、顾问自己…...
L1-009:N个数求和
目录 ⭐题目描述⭐ ⭐分析 ⭐程序代码 运行结果 ⭐文案分享⭐ ⭐题目描述⭐ 本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。 输入格式: 输入第一行给出…...
当发送“Hello,World”时,channel发生了什么?
一、Netty概述 1.Netty是什么? Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端。 2.Netty的地位怎么样? Netty 在 Java 网络应用框架中的地位就好比:Spring 框架在 JavaEE …...
服务器运行情况及线上排查问题常用命令
一、top命令 指令行: top返回: 返回分为两部分 (一)系统概览,见图知意 以下是几个需要注意的参数 1、load average: 系统负载,即任务队列的平均长度。三个数值分别为 1分钟、5分钟、15分…...
Hadoop学习笔记(HDP)-Part.18 安装Flink
目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …...
LeetCode56. 合并区间
🔗:【贪心算法,合并区间有细节!LeetCode:56.合并区间-哔哩哔哩】 class Solution { public:vector<vector<int>> merge(vector<vector<int>>& intervals) {if(intervals.size()0){return intervals;…...
解决typescript报错:找不到名称xxx
现象: 原因:在同时导入默认导出和命名导出时,默认导出必须放在命名导出之前 下面的就是原始文件: 默认导出指: export default导出类型, import时无需大括号 命名导出指: 仅有export关键字…...
UVM中封装成agent
在验证平台中加入monitor时,看到driver和monitor之间的联系:两者之间的代码高度相似。其本质是因为二者 处理的是同一种协议,在同样一套既定的规则下做着不同的事情。由于二者的这种相似性,UVM中通常将二者封装在一起,…...
OSI七层模型与TCP/IP四层模型
一、OSI七层模型简述 OSI 模型的七层是什么?在 OSI 模型中如何进行通信?OSI 模型有哪些替代方案? TCP/IP 模型关于专有协议和模型的说明 二、七层模型详解(DNS、CDN、OSI) 状态码DNS nslookup命令 CDN whois命令 …...
QT 中 QProgressDialog 进度条窗口 备查
基础API //两个构造函数 QProgressDialog::QProgressDialog(QWidget *parent nullptr, Qt::WindowFlags f Qt::WindowFlags());QProgressDialog::QProgressDialog(const QString &labelText, const QString &cancelButtonText, int minimum, int maximum, QWidget *…...
学习ShardingSphere前置知识
学习ShardingSphere前置准备知识 一. SPI SPI(Service Provider Interface)是一种Java的扩展机制,用于实现组件之间的松耦合。在SPI模型中,服务提供者(Service Provider)定义了一组接口,而服务…...
读书笔记-《数据结构与算法》-摘要3[选择排序]
选择排序 核心:不断地选择剩余元素中的最小者。 找到数组中最小元素并将其和数组第一个元素交换位置。在剩下的元素中找到最小元素并将其与数组第二个元素交换,直至整个数组排序。 性质: 比较次数(N-1)(N-2)(N-3)…21~N^2/2交换次数N运行…...
Arduino驱动MLX90614红外测温传感器(温湿度传感器)
目录 1、传感器特性 2、测量方法 3、硬件原理图 4、控制器和传感器连线图...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
