C语言基础之——指针(上)

前言:小伙伴们又见面啦!本期内容,博主将展开讲解有关C语言中指针的上半部分基础知识,一起学习起来叭!!!


目录

一.什么是指针

二.指针类型

1.指针的解引用

2.指针+-整数

三.野指针

1.野指针成因

(1)指针未初始化

 (2)指针越界访问

2.如何规避野指针

四.总结


一.什么是指针

  1. 指针是内存中一个最小单元的编号,也就是地址
  2. 我们平时所说到的指针,一般都是指针变量,是用来存放内存地址的变量

所以说指针实际上是一个地址,而存放在指针中的值都会被当成地址处理。

这里有一个小知识点:指针在32位平台上占4个字节,在64位平台上则占8个字节。具体内容相对复杂,我们这里不做讲述。

还有一点要注意,一个指针虽然占有四个字节,但是它存储的地址仅仅为一个字节,也就是这四个字节的头头。

二.指针类型

我们知道,定义一个指针变量就跟定义一个普通的变量一样,可以有不同的类型。

那我们又知道不同类型的变量,又会占有不同的内存大小。

那么不同类型的指针,也会占有不同的内存大小吗??? 

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

 我们知道sizeof是一个计算内存大小的关键字,我们用它来测试一下,结果如下:

 令人出乎意料,不同类型的指针变量,占用的内存大小竟然都相同,为什么呢???

事实上,我们定义不同类型的指针,只是为了用这个指针来存放这种类型的变量的地址

例如我们定义char*类型的指针,只是为了存放char类型变量的地址

那既然并不会影响指针的内存大小,定义这么多类型的指针又有什么意义呢???

1.指针的解引用

什么是指针的解引用呢???

当我们用指针变量通过地址来访问或者修改一个变量的值,就叫解引用。

#include<stdio.h>
int main()
{int n = 0x11223344;int* p = &n;*p = 0;return 0;
}

假如我们初始化变量n的内存大小为0x11223344,然后我们用int型的指针变量来解引用将其值改为0,我们来看它的内存怎么变化:

 可以看出n的四个字节的内存大小都变为了0

#include<stdio.h>
int main()
{int n = 0x11223344;char* p = &n;*p = 0;return 0;
}

 同样的方式,这次我们换成char型的指针变量,又会是什么结果呢???

 可以很轻易的看出,char型的指针变量,仅仅让n的一个字节的内存大小变为了0

 这便是指针类型的意义:

指针类型决定了指针进行解引用操作的时候,访问几个字节。

2.指针+-整数

#include<stdio.h>
int main()
{int n = 5;int* p1 = &n;char* p2 = &n;printf("p1 = %p\n", p1);printf("p1 + 1 = %p\n", p1 + 1);printf("p2 = %p\n", p2);printf("p2 + 1 = %p\n", p1 + 1);return 0;
}

看这段代码,int型的指针变量p1和char型的指针变量p2的内存地址是什么结果

p1和p2两个指针分别 + 1之后又会是什么结果呢

 能够看出,两个指针变量是可以同时访问一个变量的地址的。

p1+1的后的内存跳过了4个字节,而p2+1后的内存地址仅仅之跳过了1个字节

这也是指针类型的意义:

指针类型决定了指针进行+-操作的时候,跳过几个字节。

三.野指针

所谓野指针,也就是说指针指向的位置是不可知的(随机的,不正确的,没有明确限制的)

1.野指针成因

(1)指针未初始化

int *p;

*p = 10;

这样的解引用方式直接就是错误的,在VS环境下直接就会报错:

 (2)指针越界访问

#include<stdio.h>
int main()
{int arr[10] = { 0 };int* p = arr;int i = 0;for (i = 0; i <= 10; i++){*p = 1;p++;}return 0;
}

假如我们想用一个指针来改变数组中的每一个值,但是却不小心超过了数组的大小,这样就造成了越界访问,出现了错误。

指针指向的地址超过了数组的范围,就变成了野指针

2.如何规避野指针

  1. 指针要初始化
  2. 小心指针越界
  3. 指针指向的空间释放,及时置NULL
  4. 避免返回局部变量的地址
  5. 指针使用之前检查有效性

这里要注意一点,如果我们非要定义一个未知指向的指针,就要将其置NULL,也就是置0

当指针置NULL时,也相当于是存了一个空地址,不能对这个地址直接进行操作。

想要操作此指针,就必须让它指向其他已知的地址

四.总结

以上就是有关C语言基础——指针的上半部分的内容啦,稍后博主将更新指针(下),一起期待一下叭!

喜欢博主文章的小伙伴们不要忘记一键三连哦!

我们下期再见!

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

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

相关文章

【洛谷】P2678 跳石头

原题链接&#xff1a;https://www.luogu.com.cn/problem/P2678 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 二分答案。&#xff08;使用二分需要满足两个条件。一个是有界&#xff0c;一个是单调。 这题的题面&#xff1a;使得选手们在比赛过程中…

【数据结构】手撕顺序表

一&#xff0c;概念及结构 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储&#xff1b; 在数组上完成数据的增删查改。 1&#xff0c; 静态顺序表&#xff1a;使用定长数组存储元素。 2.&#xff0c;动态顺序表&#xff1…

基于Spring Boot的游泳馆管理系统的设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的游泳馆管理系统的设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java spring…

Springboot使用QueryDsl实现融合数据查询

SpringbootQueryDsl技术 1、添加依赖 <!--基于JPA--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!--QueryDSL支持--> <dependenc…

opencv进阶18-基于opencv 决策树导论

1. 什么是决策树&#xff1f; 决策树是最早的机器学习算法之一&#xff0c;起源于对人类某些决策过程 的模仿&#xff0c;属于监督学习算法。 决策树的优点是易于理解&#xff0c;有些决策树既可以做分类&#xff0c;也可以做回归。在排名前十的数据挖掘算法中有两种是决策树[1…

编程题练习@8-26

题目一&#xff1a; 题目描述 你的团队最近更新了语音识别的算法&#xff0c;瑰需要对更新之后的算法模型进行识别率指标统计。 语音识别率指标通常为WER(Word Error Rate)即计算语音识别文本中出现错误的字总数占标准文本中总字数的比例。为了使识别出来的文本序列和标准的文本…

Kafka为什么这么快?

Kafka 是一个基于发布-订阅模式的消息系统&#xff0c;它可以在多个生产者和消费者之间传递大量的数据。Kafka 的一个显著特点是它的高吞吐率&#xff0c;即每秒可以处理百万级别的消息。那么 Kafka 是如何实现这样高得性能呢&#xff1f;本文将从七个方面来分析 Kafka 的速度优…

科技资讯|荷兰电动自行车丢失将被拒保,苹果Find My可以减少丢失

荷兰最大的自行车协会荷兰皇家旅游俱乐部宣布&#xff0c;将不再为胖胎电动自行车提供保险&#xff0c;因为这种自行车的被盗风险极高。 随着电动自行车的销量飙升&#xff0c;胖胎也变得更受欢迎。但问题是&#xff0c;胖胎电动自行车也成为了自行车盗窃者的首选目标。ANWB …

字节 比特

1 字节 8 比特 //1 字节 8 位 / 比特 1 Byte 1 B 8 bit位 比特 bit 字节 Byte B 1024 1 KB 1024 B 1 MB 1024 KB 1 GB 1024 MB字&#xff0c;由若干个字节组成 32 位计算机&#xff1a;1 字 32 位 4 字节 64 位计算机&#xff1a;1 字 64 位 8 字节

【力扣】203. 移除链表元素 <链表指针>

【力扣】203. 移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5] 示例 …

当 Tubi 遇到 Ruby

有人说 Tubi 作为 RubyConf China 金牌赞助商&#xff0c;明明用极具吸引力的 Elixir 后端工程师岗位和高品质的 Elixir Meetup&#xff0c;“拐走了”一批又一批 Rubyist 投身于 Elixir 开发中&#xff0c;却依然让人想在 Tubi 展台前多停留一会儿。 为什么工程师、校友甚至 …

Android JNI修改Java对象的变量

在JNI中&#xff0c;本地代码&#xff08;C/C&#xff09;中修改了Java对象的变量&#xff0c;并且将其传递回Java端&#xff0c;那么Java端会看到变量的修改&#xff0c;尝试以下两种方式进行修改&#xff1a; 添加native方法 data class MyData(var key:Int,var value:String…

GIthub 无法访问使用Watt Toolkit加速

一、使用 Watt Toolkit Watt Toolkit 是一款加速软件&#xff0c;原名是 Steam&#xff0c;后来改名为 Watt Toolkit&#xff0c;其可以让原本无法访问的 Steam 游戏社区、 GitHub 、谷歌验证码等国内难以访问的网页正常访问。 三种下载方式&#xff1a; Watt Toolkit 官网下…

软件设计师学习笔记7-输入输出技术+总线+可靠性+性能指标

目录 1.输入输出技术 1.1数据传输控制方式 1.2中断处理过程 2.总线 3.可靠性 3.1可靠性指标 3.2串联系统与并联系统 3.3混合模型 4.性能指标 1.输入输出技术 即CPU控制主存与外设交互的过程 1.1数据传输控制方式 (1)程序控制&#xff08;查询&#xff09;方式&…

VScode使用SSH连接linux

1、官网下载和安装软件 https://code.visualstudio.com/Download 2、安装插件 单击左侧扩展选项&#xff0c;搜索插件安装 总共需要安装的插件如下所示 3、配置连接服务器的账号 安装完后会在左侧生成了远程连接的图标&#xff0c;单击此图标&#xff0c;然后选择设置图标…

JDK介绍

JDK,JRE和JVM之间的关系 JVM是运行环境&#xff0c;JRE是含运行环境和相关的类库&#xff0c;跟node环境是一个意思 JDK目录介绍 目录名称说明bin该路径下存放了JDK的各种工具命令。javac和java就放在这个目录。conf该路径下存放了JDK的相关配置文件include该路径下存放了一些…

裸露土堆识别算法

裸露土堆识别算法首先利用图像处理技术&#xff0c;提取出图像中的土堆区域。裸露土堆识别算法首通过计算土堆中被绿色防尘网覆盖的比例&#xff0c;判断土堆是否裸露。若超过40%的土堆没有被绿色防尘网覆盖&#xff0c;则视为裸露土堆。当我们谈起计算机视觉时&#xff0c;首先…

BUGFix:onnx -> TensorRT转换过程失败

先附上相关的onnx2trt的部分代码&#xff1a; def onnx2trt(onnx_path):logger trt.Logger(trt.Logger.ERROR)builder trt.Builder(logger)network builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))parser trt.OnnxParser(netw…

删除ubuntu开始菜单中的图标

背景 本来是很好看干净的界面 更新谷歌浏览器后出现了Gmail&#xff0c;幻灯片&#xff0c;谷歌硬盘等跟谷歌相关的乱七八糟东西搞得界面就很丑 解决问题 删掉那个图标 输入命令 sudo nautilus /usr/share/applicationssudo nautilus ~/.local/share/applications可以…

react18+antd5.x(1):Notification组件的二次封装

antdesign已经给我们提供了很好的组件使用体验,但是我们还需要根据自己的项目业务进行更好的封装,减少我们的代码量,提升开发体验 效果展示 开起来和官网的使用没什么区别,但是我们在使用的时候,进行了二次封装,更利于我们进行开发 MyNotification.jsx,是我们的业务页面…