当前位置: 首页 > news >正文

【C语言】初识指针

目录

一、指针是什么

 二、指针和指针类型

三、野指针

四、指针运算

五、指针和数组

六、二级指针

七、指针数组


一、指针是什么

       指针就是内存地址,指针变量是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同(指针本质就是地址)

     我们可以这么理解:

 

 😐1.指针是个变量,存放内存单元的地址/内存编号
        
#include <stdio.h>
int main()
{int a = 10;//在内存中开辟一块空间int* p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。//将a的地址存放在p变量中,p就是一个之指针变量。return 0;
}
                😀总结:指针就是变量,用来存放地址的变量。
               

 二、指针和指针类型

这里我们在讨论一下:指针的类型是什么?
        
         我们都知道,变量有不同的类型,整形,浮点型等。那指针有没有类型呢?
         其实是:有的。

 

当有这样的代码时

int num = 10;
p = &num;
😀要将&numnum的地址)保存到p中,我们知道p就是一个指针变量,那它的类型是怎样的呢?
我们给指针变量相应的类型
char  *pc = NULL;
int   *pi = NULL;
short *ps = NULL;
long  *pl = NULL;
float *pf = NULL;
double *pd = NULL;
😐这里可以看到,指针的定义方式是:type + * 。其实:char* 类型的指针是为了存放 char 类型变量的地址.short* 类型的指针是为了存放 short 类型变量的地址.int* 类型的指针是为了存放 int 类型变量的地址.
😐那指针类型的意义是什么?
指针+-整数
#include <stdio.h>
//演示实例
int main()
{int n = 10;char* pc = (char*)&n;int* pi = &n;printf("%p\n", &n);printf("%p\n", pc);printf("%p\n", pc + 1);printf("%p\n", pi);printf("%p\n", pi + 1);return 0;
}
😐总结:指针的类型决定了指针向前或者向后走一步有多大(距离)。
指针解引用
int main()
{int n = 0x11223344;char* pc = (char*)&n;int* pi = &n;*pc = 0;   //重点在调试的过程中观察内存的变化。*pi = 0;   //重点在调试的过程中观察内存的变化。return 0;
}
😀总结:指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。 比如 char* 指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。

 

三、野指针

概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)指针变量在定义时如果未初始化,其值是随机的,指针变量的值是别的变量的地址,意味着指针指向了一个地址是不确定的变量,此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的。
       野指针成因
        
        😀1. 指针未初始化
#include <stdio.h>
int main()
{ int *p;//局部变量指针未初始化,默认为随机值*p = 20;return 0;
}
        😀2. 指针越界访问
        
        
#include <stdio.h>
int main()
{int arr[10] = {0};int *p = arr;int i = 0;for(i=0; i<=11; i++){//当指针指向的范围超出数组arr的范围时,p就是野指针*(p++) = i;}return 0;
}
        😀3. 指针指向的空间释放
        
        这里放在动态内存开辟的时候讲解,这里可以简单提示一下。
          
        如何规避野指针
        1. 指针初始化
        2. 小心指针越界
        
        3. 指针指向空间释放即使置NULL
        
        4. 指针使用之前检查有效性
#include <stdio.h>
int main()
{int *p = NULL;//....int a = 10;p = &a;if(p != NULL){*p = 20;}return 0;
}

四、指针运算

       • 指针+- 整数
       • 指针-指针
       • 指针的关系运算
        😀指针+- 整数
#define N_VALUES 5
float values[N_VALUES];
float *vp;
//指针+-整数;指针的关系运算
for (vp = &values[0]; vp < &values[N_VALUES];)
{*vp++ = 0;
}

      😀 指针-指针

int my_strlen(char *s)
{char *p = s;while(*p != '\0' )p++;return p-s;
}
for(vp = &values[N_VALUES]; vp > &values[0];)
{*--vp = 0;
}

        😀指针的关系运算

for(vp = &values[N_VALUES]; vp > &values[0];)
{*--vp = 0;
}
代码简化, 这将代码修改如下:
        
        
for(vp = &values[N_VALUES-1]; vp >= &values[0];vp--)
{*vp = 0;
}
😐实际在绝大部分的编译器上是可以顺利完成任务的,然而我们还是应该避免这样写,因为标准并不保证它可行
标准规定:
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。

五、指针和数组

数组名是什么?我们看一个例子:
#include <stdio.h>
int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,0};printf("%p\n", arr);printf("%p\n", &arr[0]);return 0;
}

运行结果:

😀可见数组名和数组首元素的地址是一样的。
😀结论:数组名表示的是数组首元素的地址
    那么这样写代码是可行的:
    
int arr[10] = {1,2,3,4,5,6,7,8,9,0};
int *p = arr;//p存放的是数组首元素的地址

  既然可以把数组名当成地址存放到一个指针中,我们使用指针来访问一个就成为可能。

  例如:
#include <stdio.h>
int main()
{int arr[] = {1,2,3,4,5,6,7,8,9,0};int *p = arr; //指针存放数组首元素的地址int sz = sizeof(arr)/sizeof(arr[0]);for(i=0; i<sz; i++){printf("&arr[%d] = %p   <====> p+%d = %p\n", i, &arr[i], i, p+i);}return 0;
}

   

运行结果:

 

六、二级指针

指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?这就是 二级指针

 

 

😐对于二级指针的运算有:
😍*ppa 通过对ppa中的地址进行解引用,这样找到的是 pa *ppa 其实访问的就是 pa
int b = 20;
*ppa = &b;//等价于 pa = &b;
😍**ppa 先通过 *ppa 找到 pa ,然后对 pa 进行解引用操作: *pa ,那找到的是 a
**ppa = 30;
//等价于*pa = 30;
//等价于a = 30;
int arr1[5];
char arr2[6];

七、指针数组

       😍 1.指针数组是指针还是数组?
                答案:是数组。是存放指针的数组。
        
       😀 2.数组我们已经知道整形数组,字符数组。

 

        😐那指针数组是怎样的?
        
        
int* arr3[5];
        🫡arr3是一个数组,有五个元素,每个元素是一个整形指针

相关文章:

【C语言】初识指针

目录 一、指针是什么 二、指针和指针类型 三、野指针 四、指针运算 五、指针和数组 六、二级指针 七、指针数组 一、指针是什么 指针就是内存地址&#xff0c;指针变量是用来存放内存地址的变量&#xff0c;在同一CPU构架下&#xff0c;不同类型的指针变量所占用的存储单元长度…...

FFMPEG自学一 音视频解封装

一、音视频包含哪些数据对于一个mp4文件我们可以通过音视频分析软件打开查看内部信息。从两图可以看出mp4文件一般包含 音频流 视频流等。对于上面的字段大致分析如下Format编码方式AVC现在大部分视频都是这种编码方式&#xff0c;即H264。CodecId编码器idavc1H264封装有2种格式…...

HoloLens 2 丨打包丨MRTK丨Unity丨新手教学

HoloLens 2打包流程制作前言开发工具介绍Visual Studio 2019MRTK插件或示例程序下载打包流程介绍Unity操作修改Visual Studio修改Hololens 修改Hololens 密码忘记总结前言 提示&#xff1a;今日功能介绍 使用 MRTK制作hololens 2的打包流程制作的新手教学。 开发工具介绍 这…...

AcWing语法基础课笔记 第四章 C++中的数组

第四章 C中的数组 程序 逻辑 数据&#xff0c;数组是存储数据的强而有力的手段。 ——闫学灿 一维数组 数组的定义 数组的定义方式和变量类似。 数组的初始化 在main函数内部&#xff0c;未初始化的数组中的元素是随机的。 访问数组元素 通过下标访问数…...

UTF小结

运行测试 编辑测试 运行模式&#xff1a;程序集Platform平台选择 Any Platforms编辑模式&#xff1a;程序集Platform平台选择 Editor 特性 Test、UnityTest特性&#xff1a;测试方法需要添加Test或UnityTest特性&#xff0c;测试方法是公有的SetUp、TearDown特性&#xff1a…...

(考研湖科大教书匠计算机网络)第四章网络层-第六节3:开放最短路径优先OSPF的基本工作原理

获取pdf&#xff1a;密码7281专栏目录首页&#xff1a;【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一&#xff1a;OSPF概述&#xff08;1&#xff09;概述&#xff08;2&#xff09;细节阐述A&#xff1a;链路状态和代价B&#xff1a;问候分组和邻居表C&#xff…...

积水在线监测仪——积水点、易涝点水位监测设备

一、设备概述 积水在线监测仪是一款用于城市积水点、易涝点等场景的水位监测设备&#xff0c;设备采用电池供电&#xff0c;无需另外供电&#xff0c;安装方便&#xff0c;使用简单。可以时监测水点、易涝点水位情况&#xff0c;当水位数据超过阈值后触发告警上传&#xff0c;…...

DCMM认证机构

一、什么是DCMM DCMM认证&#xff0c;又称为数据管理能力成熟度评估&#xff0c;依据 都是GB/T -《数据管理能力成熟度评估模型》&#xff0c;这是我国首个数据管理领域的国家标准&#xff0c;由国家质量监督检验检疫总局、国家标准化管理委员会于年3月15日正式发布。DCMM认证…...

Golang基于文件魔数判断文件类型

本文介绍基于魔数判断文件类型&#xff0c;涉及文件查找读取内容、文件魔数、字节比较&#xff0c;最后还介绍函数参数的知识。 查找位置 File.Seek()函数可以设置偏移位置&#xff0c;为下一次读或写确定偏移量&#xff0c;具体起点有whence确定&#xff1a;0标识相对文件开始…...

MySQL——索引视图练习题

学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键 课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名 Cno为主键 学生选课表&#xff1a;SC (Sno, Cno, Score)…...

哈希表题目:矩阵置零

文章目录题目标题和出处难度题目描述要求示例数据范围进阶解法一思路和算法代码复杂度分析解法二思路和算法代码复杂度分析解法三思路和算法代码复杂度分析题目 标题和出处 标题&#xff1a;矩阵置零 出处&#xff1a;73. 矩阵置零 难度 3 级 题目描述 要求 给定一个 m…...

HTTP API自动化测试从手工到平台的演变

不管是 Web 系统&#xff0c;还是移动 APP&#xff0c;前后端逻辑的分离设计已经是常态化&#xff0c;相互之间通过 API 调用进行数据交互。在基于 API 约定的开发模式下&#xff0c;如何加速请求 / 响应的 API 测试&#xff0c;让研发人员及早参与到调试中来呢&#xff1f;既然…...

【从零开始学C语言】知识总结一:C语言的基本知识汇总

C语言期末知识点总结 C语言期末试题&#xff08;附答案&#xff09;选择题编程题 2022C语言知识点大全【详细、必备】 C语言期末大作业-学生成绩管理系统&#xff08;完整源码设计报告&#xff09; C语言期末作业&#xff08;15个&#xff09;-货物管理系统、歌曲信息管理系…...

CAD二次开发 添加按钮Ribbon

这篇文章是教大家怎样子创建自己的Ribbon按钮界面&#xff08;如下图&#xff09;&#xff0c;以下示例代码在CAD2020中运行实现。 背景 创建一个属于自己的Ribbon按钮&#xff08;如下图&#xff09; 理解Ribbon、Panel、Tab的关系&#xff08;如下图&#xff09;&#xff…...

[RK3568 Android12] 添加自定义启动脚本

1:定义添加的脚本 比如为displayn2k.sh #!/system/bin/sh log "displayn2k.sh begin running" sleep 5 log "displayn2k.sh sleep 8" sleep 5 log "================sleep finished==========================" #remount /system/bin/mount -o …...

API 体系构建

前言 API 是模块或者子系统之间交互的接口定义。好的系统架构离不开好的 API 设计&#xff0c;而一个设计不够完善的 API 则注定会导致系统的后续发展和维护非常困难。在关键环节制定明确的 API 规范有助于 Service 对内提高产品间互通的效率&#xff0c;对外提供一致的使用体…...

RMPE: Regional Multi-Person Pose Estimation (AlphaPose)阅读笔记

区域多人姿态估计 ICCV 2017 论文链接 代码链接 摘要&#xff1a; 野外多人姿态估计具有挑战性。sota人体检测器不可避免存在定位和识别误差&#xff0c;这些误差可能导致依赖人体检测器的单人姿态估计器&#xff08;SPPE&#xff09;的失败。本文提出了一种新的区域多人姿态估…...

2月16日昆明面试经历部分考题

2月16日昆明面试部分考题 1.说说em和rem的区别&#xff1f;rpx呢&#xff1f; rem是相对于根元素&#xff08;HTML&#xff09;进行计算&#xff0c;而em是相对于当前元素或父元素的字体大小&#xff0c;如果当前文本的字体尺寸没有设置&#xff0c;则相对于浏览器的默认字体…...

ARC140D One to One

ARC140D One to One 题目大意 对于一个长度为nnn的整数序列X(x1,x2,…xn)X(x_1,x_2,\dots x_n)X(x1​,x2​,…xn​)&#xff0c;每个元素都在111到nnn之间&#xff0c;令f(X)f(X)f(X)表示以下问题的答案&#xff1a; 有一个nnn个顶点nnn条边的无向图&#xff08;可能有重边和…...

联合身份验证与Cognito

Hello大家好&#xff0c;我们接下来讨论AWS联合身份验证的内容。 AWS联合身份验证 对于考试&#xff0c;联合身份验证部分是一块非常重要的内容。那什么是联合身份验证&#xff0c;它是做什么用的呢&#xff1f; 联合身份验证&#xff0c;是用来允许AWS外部用户&#xff0c;如…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...