C语言指针入门详解
一、指针简介
- 指针(Pointer)是C语言的一个重要知识点,其使用灵活、功能强大,是C语言的灵魂
- 指针与底层硬件联系紧密,使用指针可操作数据的地址,实现数据的间接访问
- 指针就是地址,通过访问此地址来获取该地址存储的数据
二、计算机存储机制
每个字节(Byte)(8位Bits)对应有自己的地址;
1、 int a = 0x123456;(一个整型是4个字节,即32位),下图中是以小端字节序跨字节存储,有关字节序内容请参考Linux系统编程-网络通信_linux系统网络通信_单行梦想家的博客-CSDN博客
2、short b = 0x5A6B;
3、char c[ ] = {0x33,0x34,0x35}; char型是一个字节;数组在内存中必须分配一个连续的线性空间;
如果要把short d[ ] = {0x5A6B,0X5B6A}存储,表示为图二,数组元素按顺序存储(0->1...),每个short按小端字节序存储
三、定义指针
- 指针即指针变量,用于存放其他数据单元(变量/数组/结构体/函数等)的首地址。
- 若指针存放了某个数据单元的首地址,则这个指针指向了这个数据单元
- 若指针存放的值是0,则这个指针为空指针
- 定义一个指针变量:

16位系统:x=2,32位系统:x=4,64位系统:x=8 (与系统位宽相等)
demo1:查看数据类型的长度(即存储大小)#include <stdio.h>int main()
{int a;int *p1;char b;char *p2;printf("a:%d\n",sizeof(a));printf("p1:%d\n",sizeof(p1));printf("b:%d\n",sizeof(b));printf("p2:%d\n",sizeof(p2));return 0;}>>>运行结果:
a:4
p1:8
b:1
p2:8
四、指针操作
若已定义:
int a; //定义一个int型的数据
int *p; //定义一个指向int型数据的指针
则对指针p有如下操作方式:
demo2:打印char型变量a的地址#include <stdio.h>int main()
{char a = 0x66;char *p = &a;printf("a:%x\n",a);printf("p:%x\n",p);printf("取内容p:%x\n",*p);return 0;}>>>运行结果:
a:66
p:61fe17
取内容p:66
指针++的操作:偏移的是1个数据宽度,int*就是4个字节,char*就是1个字节,short*2个字节
demo3:指针++操作#include <stdio.h>int main()
{char a;char *p1 = &a;int b;int *p2 = &b;printf("p1:%x\n",p1);printf("p2:%x\n",p2);p1++;p2++;printf("p1++:%x\n",p1);printf("p2++:%x\n",p2);return 0;}>>>运算结果:
p1:61fe0f
p2:61fe08
p1++:61fe10
p2++:61fe0c
五、数组与指针
- 数组是一些相同数据类型的变量组成的集合,其数组名即为指向该数据类型的指针。
- 数组的定义等效于申请内存、定义指针和初始化
例如:
char c[ ] = {0x33, 0x34, 0x35};
等效于: 申请内存
定义 char *c = 0x4000;
初始化数组数据
利用下标引用数组数据也等效于指针取内容
例如: c[0]; 等效于: *c;
c[1]; 等效于: *(c+1);
c[2]; 等效于: *(c+2);
demo4:数组与指针#include <stdio.h>
#include <stdlib.h>int main()
{//char a[] = {0x33,0x34,0x35};//等效于以下步骤char *a;a=malloc(3*1);*a=0x33;*(a+1)=0x34;*(a+2)=0x35;printf("a[0]=%x\n",a[0]);printf("a[1]=%x\n",a[1]);printf("a[2]=%x\n",a[2]);printf("a[0]=%x\n",*a);printf("a[1]=%x\n",*(a+1));printf("a[2]=%x\n",*(a+2));return 0;}>>>运算结果:
a[0]=33
a[1]=34
a[2]=35
a[0]=33
a[1]=34
a[2]=35
六、注意事项
- 在对指针取内容之前,一定要确保指针指在了合法的位置,否则将会导致程序出现不可预知的错误
- 同级指针之间才能相互赋值,跨级赋值将会导致编译器报错或警告
七、指针应用
传递参数
- 使用指针传递大容量的参数,主函数和子函数使用的是同一套数据,避免了参数传递过程中的数据复制,提高了运行效率,减少了内存占用
- 使用指针传递输出参数,利用主函数和子函数使用同一套数据的特性,实现数据的返回,可实现多返回值函数的设计
传递返回值
- 将模块内的公有部分返回,让主函数持有模块的“句柄”,便于程序对指定对象的操作
直接访问物理地址下的数据
- 访问硬件指定内存下的数据,如设备ID号等
- 将复杂格式的数据转换为字节,方便通信与存储
demo5:函数返回多个返回值,求数组中最大值以及该值出现的次数#include <stdio.h>void FindMaxAndCount(int *max,int *count,const int *array,int length)
{int i;*max=array[0];*count=1;for(i=1;i<length;i++){if(array[i]>*max){*max=array[i];*count=1;}else if(array[i]==*max){(*count)++;}}
} int main()
{int a[]={1,2,4,6,4,6,3};int Max;int Count;FindMaxAndCount(&Max,&Count,a,7);printf("Max=%d\n",Max);printf("Count=%d\n",Count);return 0;}
相关文章:
C语言指针入门详解
一、指针简介 指针(Pointer)是C语言的一个重要知识点,其使用灵活、功能强大,是C语言的灵魂指针与底层硬件联系紧密,使用指针可操作数据的地址,实现数据的间接访问指针就是地址,通过访问此地址来获取该地址存储的数据 …...
软件工程(十四) 设计模式之结构型模式(二)
1、组合模式 简要说明 将对象组合成树形结构以表示“整体-部分”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。 速记关键字 树形目录结构 类图如下 由类图其实可以看出,组合模式就是将具有父子关系的结构,组装形成一棵树,并且根据规范,树干节点和叶子节…...
不解压的方式直接更新jar包内部的内容
前言 如果线上直接更新一个class,可以不用解压,直接利用jar命令直接更新jar报的资源和内容 更新jar包内容文件 Jar 工具提供了一个 u 选项,你可以通过修改其清单或添加文件来更新现有 JAR 文件的内容。 添加文件的基本命令具有以下格式&am…...
软件工程(八) UML之类图与对象图
1、类图与对象图 1.1、类图与对象图的概念 类图(class diagram)描述一组类、接口、协作和它们之间的关系 对象图(object diagram)描述一组对象及它们之间的关系、对象图描述了在类图中所建立的事物实例的静态快照。 1.2、类图与对象图的区别 类图和对象图基本上是一样…...
【Unity3D赛车游戏】【五】Unity中汽车加速效果是如何优化的?
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:Uni…...
龙智案例:某大型零售企业如何打造高速、现代化的ITSM体系
在2023 DevOps国际峰会北京站的现场,我们对话了龙智咨询顾问胡若愚,他为我们奖助了一位零售业的大型客户是如何在数字化浪潮中,凭借龙智提供的Jira Service Management产品及服务,打造现代化ITSM平台,提升客户满意度。…...
jdk 03.stream
01.集合处理数据的弊端 当我们在需要对集合中的元素进行操作的时候,除了必需的添加,删除,获取外,最典型的操作就是集合遍历 package com.bobo.jdk.stream; import java.util.ArrayList; import java.util.Arrays; import java.ut…...
“华为杯”研究生数学建模竞赛2018年-【华为杯】C题:对恐怖袭击事件记录数据的量化分析
目录 摘 要: 一、 问题背景与重述 1.1 问题背景 1.2 问题重述 二、 问题分析...
java8的reduce方法
在 Java 8 中,reduce 是一个流操作方法,用于将流中的元素按照指定的操作进行归约(reduce)操作,最终得到一个结果。 reduce 方法有三种重载形式: T reduce(T identity, BinaryOperator<T> accumulato…...
Mac发现有的软件不能上网的破解之法
1、Mac上打开终端 terminal ,获取 root 权限。 sudo -i 2、编辑 hosts 文件 vim /private/etc/hosts 3、找到被禁止软件的数据请求域名,然后删除相关行,快捷件dd,然后:wq保存退出 比如百度 127.0.0.1 pan.baidu.com ##sec 印…...
定时检测接口是否正常飞书告警脚本
第一版 支持多个接口地址,循环检测,定时每分钟执行一次脚本 告警效果 脚本 飞书机器人创建忽略跳过,各大协作平台大同小异拿出机器人hook地址 #!/bin/bash URL_LIST=(https://gatewaxxxxxxxxxxxxxxxxxx https://sandbox-gatexxxxxxxxxxxxxxxxxx)for URL in ${URL_LIST[*...
【MySQL】2、MySQL数据库的管理
常用 describe user; Field:字段名称 Type:数据类型 Null :是否允许为空 Key :主键 Type:数据类型 Null :是否允许为空key :主键 Default :默认值 Extra :扩展属性,例如:标志符列(标识了种子,增量/步长)1 2 id:1 3 5 …...
8086汇编test指令学习
Test指令将两个操作数进行逻辑与运算,并根据运算结果设置相关的标志位。Test的两个操作数不会被改变。运算结果在设置过相关标记位后会被丢弃。 TEST AX,BX 与 AND AX,BX 命令有相同效果,只是Test指令不改变AX和BX的内容,而AND指令会把结果保…...
简单js逆向案例(2)
文章目录 前文分析完整代码结尾 前文 本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 分析 目标网址 aHR0cHM6Ly9zZWFyY2guYmlkY2VudGV…...
azure data studio SQL扩展插件开发笔记
node.js环境下拉取脚手架 npm install -g yo generator-azuredatastudio yo azuredatastudio 改代码 运行 调试扩展,在visual studio code中安装插件即可 然后visual studio code打开进行修改运行即可 image.png 运行后自动打开auzre data studio了, 下面…...
【二分】搜索旋转数组
文章目录 不重复数组找最小值,返回下标重复数组找最小值,返回下标不重复数组找target,返回下标重复数组找target,返回bool重复数组找target,返回下标 不重复数组找最小值,返回下标 class Solution {public …...
APSIM模型应用与参数优化、批量模拟
APSIM (Agricultural Production Systems sIMulator)模型是世界知名的作物生长模拟模型之一。APSIM模型有Classic和Next Generation两个系列模型,能模拟几十种农作物、牧草和树木的土壤-植物-大气过程,被广泛应用于精细农业、水肥管理、气候变化、粮食安…...
QT使用QXlsx实现对Excel sheet的相关操作 QT基础入门【Excel的操作】
准备:搭建环境引用头文件QT中使用QtXlsx库的三种方法 QT基础入门【Excel的操作】_吻等离子的博客-CSDN博客 #include "xlsxdocument.h"QTXLSX_USE_NAMESPACE // 添加Xlsx命名空间(https://github.com/dbzhang800/QtXlsxWriter) or QXLSX_USE_NAMESPACE // 添加Xl…...
ARM DIY(四)WiFi 调试
文章目录 焊接打开内核编译选项重新编译内核烧录 && 运行 && 测试完善脚本测速手搓天线正式天线 焊接 换个粗点的风枪嘴,让热风覆盖 RTL8823BS 整体模块,最终实现自动归位 焊接 SDIO 接口的上拉电阻以及复位引脚上拉电阻 硬件部分就这…...
AIGC ChatGPT 实现动态多维度分析雷达图制作
雷达图在多维度分析中是一种非常实用的可视化工具,主要有以下优势: 易于理解:雷达图使用多边形或者圆形的形式展示多维度的数据,直观易于理解。多维度对比:雷达图可以在同一张图上比较多个项目或者实体在多个维度上的…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
从实验室到产业:IndexTTS 在六大核心场景的落地实践
一、内容创作:重构数字内容生产范式 在短视频创作领域,IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色,生成的 “各位吴彦祖们大家好” 语音相似度达 97%,单条视频播放量突破百万…...
Python爬虫实战:研究Restkit库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …...
react菜单,动态绑定点击事件,菜单分离出去单独的js文件,Ant框架
1、菜单文件treeTop.js // 顶部菜单 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定义菜单项数据 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 权限管理,key: 2,icon:…...


