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

【C语言】指针初阶

在这里插入图片描述

正文开始之前,我们要记住一个东西就是:地址=指针

目录

  • 一、指针的解释
  • 二、指针变量和地址
    • 1、取地址操作符
    • 2、指针变量和解引用操作
      • 1、指针变量
      • 2、拆解指针类型
      • 3、解引用操作符
      • 4、注意事项
    • 3、指针变量的大小
    • 4、指针的解引用
    • 5、void*指针
  • 三、指针的运算
    • 1、指针±整数
    • 2、指针 - 指针
    • 3、指针的关系运算
  • 四、野指针
    • 1、野指针形成的原因
    • 2、指针越界访问
    • 3、指针指向的空间释放
  • 五、const 修饰指针
    • 1、const修饰变量
    • 2、const修饰指针变量

一、指针的解释

通俗来讲就是某一数据的位置。因为数据的存储是需要空间的,这个空间会有一个地址,指针就是用来存放这个地址的,以便于后续快速的访问

二、指针变量和地址

1、取地址操作符

在C语⾔中创建变量就是向内存申请空间

#include <stdio.h>
int main()
{int a = 10;return 0;
}

在这里插入图片描述
我们在内存里可以看到在创建变量a的时候申请了一块空间
我们取地址a之后将地址四行显示,发现a存储在了这个地址里,0a就是十六进制下的10
这里我们介绍一下我们的老朋友,&操作符。在以前的学习中,我们在学习scanf函数的时候接触过这个操作符,这个操作符就叫做取地址操作符。
在这里插入图片描述
&a取出的是a所占的四个字节中地址最小的字节的地址,通过计算机的一套算法,它懂得这个数据是整形,会取出剩下的三个地址

(这时候我们对scanf函数的理解也会深一个层次

scanf("%d",&a);

这里的&a就是取出a的地址,将里边的值进行修改)

2、指针变量和解引用操作

1、指针变量

那我们通过取地址操作符(&)拿到的地址是⼀个数值,这个数值有时候需要存储起来,⽅便后期再使⽤,我们会把这样的地址值存放在指针变量中。

#include <stido.h>
int main()
{int a = 10;int *pa = &a;//这样就把取出的a的地址存放到指针pa中了return 0;
}

指针变量也是变量,专门用来存放地址,存放在其中的值都会被认为是地址

2、拆解指针类型

    int a = 10;int *pa = &a;

*说明pa是指针变量,int 说明pa这个指针变量指向的是一个int类型也就是整型类型的对象
当然如果是short类型的对象那么就

short i = 10;
short *pi = &i;

char类型那么就

char j = 10;
char * pj = &j;

3、解引用操作符

#include <stido.h>
int main()
{int a = 10;int *pa = &a;*pa = 20;return 0;
}

这样就把a的值更改为20了

4、注意事项

int*pa
int *pa
int* pa
int * pa

这几个是一样的,表达上没有任何的区别

3、指针变量的大小

#include <stdio.h>
int main()
{printf("%zd\n", sizeof(char *));printf("%zd\n", sizeof(short *));printf("%zd\n", sizeof(int *));printf("%zd\n", sizeof(double *));return 0;
}

指针变量的大小取决于地址的大小,指针变量的大小和类型是⽆关,只要指针类型的变量在相同的平台下,大小都是相同的

4、指针的解引用

#include <stdio.h>
int main()
{int n = 0x12345678;int *pi = &n; *pi = 0; printf("%d",n):return 0;
}
#include <stdio.h>
int main()
{int n = 0x12345678;char *pi =(char*) &n; //强制转化,不然是不可以用char类型的指针来接受int类型的变量的*pi = 0; printf("%d",n);return 0;
}

第一个运行结果
在这里插入图片描述
第二个的运行结果
在这里插入图片描述
在这里插入图片描述
这说明char类型和int类型的访问权限不同,char类型可以访问一个字节,也就是十六进制下的两位数,int类型可以访问四个字节,也就是十六进制下的八位数

5、void*指针

⽆具体类型的指针,也叫泛型指针,可以接受任何类型的地址
但它不能够进行解引用操作,以及指针±整数的运算(下面来说)

三、指针的运算

1、指针±整数

#include <stdio.h>
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int* p = &arr[0];int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);for (i = 0; i < sz; i++){printf("%d ", *(p + i));//p+i 这⾥就是指针+整数}return 0;
}

这里的指针经过加减后是通过单位进行访问的,也就是如果是int类型,那么指针就加了四个字节,char加一个字节,short加两个字节。

2、指针 - 指针

#include <stdio.h>
int my_strlen(char* s)
{char* p = s;while (*p != '\0')// \0 之前的元素为字符串中的元素p++;return p - s;
}
int main()
{printf("%d\n", my_strlen("abc"));return 0;
}

这样就可以算出字符串中的元素个数

3、指针的关系运算

#include <stdio.h>
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int* p = &arr[0];int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);while (p < arr + sz) //指针的⼤⼩⽐较{printf("%d ", *p);p++;}return 0;
}

四、野指针

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[0];int i = 0;for (i = 0; i <= 11; i++){//当指针指向的范围超出数组arr的范围时,p就是野指针*(p++) = i;}return 0;
}

3、指针指向的空间释放

#include <stdio.h>
int* test()
{int n = 100;return &n;
}
int main()
{int* p = test();printf("%d\n", *p);return 0;
}

这些原因其实都很常见,也很有规矩,看一下就能看出来是理所应当的,没啥需要解释的
想办法规避它们就行了

五、const 修饰指针

1、const修饰变量

#include <stdio.h>
int main()
{int m = 0;m = 20;//m是可以修改的const int n = 0;n = 20;//n是不能被修改的return 0;
}

被const修饰的变量是不能修改的

2、const修饰指针变量

int * p;//没有const修饰
const int * p;//const 放在*的左边做修饰
int const * p;//const 放在*的左边做修饰
int * const p;//const 放在*的右边做修饰

第二行和第三行实际是一样的。
我的理解是看const修饰的量,被其修饰的量是不能改变的,我们先来看第二行和第三行代码,*p不能改变,*p是变量值,也就是指针指向的那个变量的内容,它是不能够改变的,但p也就是地址,指针本身,是可以改变的。
第四行代码,const修饰p,地址,指针本身,是不能改变的,但指针指向的变量的内容是不能改变的
在这里插入图片描述

分享就到这了~

相关文章:

【C语言】指针初阶

正文开始之前&#xff0c;我们要记住一个东西就是&#xff1a;地址指针 目录 一、指针的解释二、指针变量和地址1、取地址操作符2、指针变量和解引用操作1、指针变量2、拆解指针类型3、解引用操作符4、注意事项 3、指针变量的大小4、指针的解引用5、void*指针 三、指针的运算1、…...

07_html

文章目录 引言前端概述分类 HTML快速入门重要的body标签注释hr标签br标签一些常见的标签标题标签div标签span标签p标签a标签img标签路径问题 ol和ul标签table标签input标签&#xff08;表单元素&#xff09;textarea标签&#xff08;表单元素&#xff09;select标签&#xff08…...

全量知识系统问题及SmartChat给出的答复 之1

Q1. 一套完整的全量知识系统应该有哪些组成部分&#xff1f; 一套完整的全量知识系统应该包括以下组成部分&#xff1a; 数据采集&#xff1a;收集、整理、清洗和存储各种数据&#xff0c;包括结构化数据、半结构化数据和非结构化数据等。 数据存储和管理&#xff1a;建立可靠…...

【appium】App类型、页面元素|UiAutomator与appium|App元素定位

目录 一、App前端基础知识 1、App类型划分 2、App类型对比 3、App页面元素 App页面元素分为布局和控件两种 常见布局&#xff1a; 常见控件&#xff1a;定位软件&#xff1a;appium和sdk自带的uiautomatorviewer都可以定位 二、App元素定位 1、id定位 2、text定位 3…...

ChatGpt大模型入门

环境配置 创建虚拟环境 建议创建一个新的虚拟环境&#xff0c;避免安装依赖冲突&#xff0c; conda下载&#xff1a; https://docs.conda.io/en/latest/miniconda.html conda安装&#xff1a; https://zhuanlan.zhihu.com/p/591091259 或者使用venv 使用参考&#xff1a;http…...

Mac 配置Clion Qt 调试显示变量值

背景 使用Clion开发Qt程序&#xff0c;在进行调试时&#xff0c;会看不到Qt类的变量值&#xff0c;只有指针形式&#xff0c;对于调试很不方便。 环境&#xff1a; Macbook ProCPU&#xff1a;M3Qt 5.15.13CLion 2023.3.4 解决方案 为了让Clion能显示Qt类的值&#xff0c;…...

【Ansys Fluent Web 】全新用户界面支持访问大规模多GPU CFD仿真

基于Web的技术将释放云计算的强大功能&#xff0c;加速CFD仿真&#xff0c;从而减少对硬件资源的依赖。 主要亮点 ✔ 使用Ansys Fluent Web用户界面™&#xff08;UI&#xff09;&#xff0c;用户可通过任何设备与云端运行的仿真进行远程交互 ✔ 该界面通过利用多GPU和云计算功…...

13.云原生之常用研发中间件部署

云原生专栏大纲 文章目录 mysql主从集群部署mysql高可用集群高可用互为主从架构互为主从架构如何实现主主复制中若是两台master上同时出现写操作可能会出现的问题该架构是否存在问题&#xff1f; heml部署mysql高可用集群 nacos集群部署官网文档部署nacoshelm部署nacos redis集…...

远离远程代码执行 ,RPC 运行时中的三个漏洞是如何被发现的?

引言 MS-RPC 是 Windows 网络中广泛使用的协议&#xff0c;许多服务和应用程序都依赖它。 因此&#xff0c;MS-RPC 中的漏洞可能会导致严重后果。 Akamai 安全情报小组在过去一年中一直致力于 MS-RPC 研究。 我们发现并利用了漏洞&#xff0c;构建了研究工具&#xff0c;并编写…...

零基础学python之高级编程(4)---python异常类型及其类型处理

python异常类型及其类型处理 文章目录 python异常类型及其类型处理前言一、异常的概念二、异常类型1.捕获异常方法2.主动抛出异常 总结 前言 我们在日常学习中或者在开发一个项目时,一定会出现的问题就是报错,今天我们就学习错误类型的种类以及错误类型的处理方法 一、异常的概…...

如何实现三维模型在网页/手机端/APP上的展示与分享?

在四维轻云平台中&#xff0c;只需要简单几步&#xff0c;就能轻松实现三维模型在网页/手机端/APP上的交互展示&#xff0c;也可分享转发给他人进行在线查看。 1、注册登录 打开四维轻云官网&#xff0c;完成注册并登录。 2、创建项目 在【项目管理】中点击“新建项目”按钮…...

SpringBoot项目在进行部署打包的时候,打包成jar和war有何差异?

首先给大家来讲一个我们遇到的一个奇怪的问题: 我的一个springboot项目&#xff0c;用mvn install打包成jar&#xff0c;换一台有jdk的机器就直接可以用java -jar 项目名.jar的方式运行&#xff0c;没任何问题&#xff0c;为什么这里不需要tomcat也可以运行了&#xff1f; 然…...

ARM系列 -- 虚拟化(四)

今天来看看虚拟中断。 在一个非虚拟化的系统中&#xff0c;操作系统可以直接访问GIC的寄存器&#xff0c;并且处理GIC的物理中断接口&#xff08;physical interrupt interface&#xff09;。 但是在一个虚拟化的系统中&#xff0c;不是这样。Guest OS并不知道它运行在虚拟系…...

QT GUI编程常用控件学习

1 GUI编程应该学什么 2 QT常用模块结构 QtCore: 包含了核心的非GUI的功能。主要和时间、文件与文件夹、各种数据、流、URLs、mime类文件、进程与线程一起使用 QtGui: 包含了窗口系统、事件处理、2D图像、基本绘画、字体和文字类 QtWidgets: 包含了一些列创建桌面应用的UI元素…...

【Python从入门到进阶】49、当当网Scrapy项目实战(二)

接上篇《48、当当网Scrapy项目实战&#xff08;一&#xff09;》 上一篇我们正式开启了一个Scrapy爬虫项目的实战&#xff0c;对当当网进行剖析和抓取。本篇我们继续编写该当当网的项目&#xff0c;讲解刚刚编写的Spider与item之间的关系&#xff0c;以及如何使用item&#xff…...

flutter build ipa 打包比 xcode archive 打出的ipa包大

为什么 flutter build ipa 打包比 xcode archive 打出的ipa包大&#xff1f; 如果你用Flutter构建的.ipa文件比通过Xcode Archive构建的.ipa文件要大&#xff0c;这可能是因为Flutter构建了一个包含了多平台的二进制文件的通用包。这意味着在Flutter构建的.ipa中包含了所有的C…...

B端系统:巧妙地容错和防错设置,减少用户操作错误

Hi&#xff0c;大家好&#xff0c;我是大美B端工场&#xff0c;从事8年前端开发的老司机。很多B端系统体验不好&#xff0c;让用户非常茫然或者容易出错&#xff0c;大大降低了操作体验&#xff0c;本文着重分析B端系统的容错机制该如何设计&#xff0c;欢迎老铁们关注、评论、…...

BIO实战、NIO编程与直接内存、零拷贝深入辨析

BIO实战、NIO编程与直接内存、零拷贝深入辨析 长连接、短连接 长连接 socket连接后不管是否使用都会保持连接状态多用于操作频繁&#xff0c;点对点的通讯&#xff0c;避免频繁socket创建造成资源浪费&#xff0c;比如TCP 短连接 socket连接后发送完数据后就断开早期的http服…...

PDF文件转换为图片

现在确实有很多线上的工具可以把pdf文件转为图片&#xff0c;比如smallpdf等等&#xff0c;都很好用。但我们有时会碰到一些敏感数据&#xff0c;或者要批量去转&#xff0c;那么需要自己写脚本来实现&#xff0c;以下脚本可以提供这个功能~ def pdf2img(pdf_dir, result_path…...

【Java程序设计】【C00317】基于Springboot的智慧社区居家养老健康管理系统(有论文)

基于Springboot的智慧社区居家养老健康管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的智慧社区居家养老健康管理系统设计与实现&#xff0c;本系统有管理员、社区工作人员、医生以及家属四种角色权限 管…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...