【C语言 - 初阶指针 概念、类型、野指针、指针运算】

news2024/11/16 0:53:13

C语言 - 初阶指针

  • 一 指针概念
    • 注意:
    • 指针变量的大小:(与指向的数据类型无关)
  • 二 指针类型
    • 2.1指针类型的含义:
      • 2.1.1 不同指针类型决定解引用时候权限不同:
        • 总结:
      • 2.1.2 任何类型的指针变量都能存放地址(即使跨类型)
  • 三 野指针(非法的指针):
    • 3.1 可能出现野指针的情况:
      • (1) 指针未初始化:指针里面是一个随机值,解引用会造成非法访问内存
      • (2) 指针越界:
    • 3.2 如何避免野指针:
  • 四 指针运算:
    • 4.1 指针+-整数:
    • 4.2 指针-指针:
  • 五 数组和指针之间的关系
  • 六 二级指针:
  • 七 指针数组:存放指针的数组(本质上是数组)
  • 其他:

一 指针概念

内存单元都有对应的编号----这个编号就称为地址(地址能够找到内存单元,形象称指针)

两层含义:

(1)某元素的地址

(2)指针变量口头也被称为指针

注意:

对某变量取地址
在这里插入图片描述
指针是一个变量,是用来存放地址的变量:指针变量

指针变量的定义:所指向的数据类型* 指针变量名

指针变量的大小:(与指向的数据类型无关)

在这里插入图片描述

二 指针类型

2.1指针类型的含义:

2.1.1 不同指针类型决定解引用时候权限不同:

(1)int型(整形)指针解引用可以访问四个字节:

int *p;

*(p+1):跳过4个字节

(2)char型(字符型)指针解引用只可以访问一个字节

char *p;

*(p+1):跳过一个字节

总结:

  • 指针的类型决定了对指针解引用时候的权限

  • 指针的类型也决定了指针向前或者向后走一步的距离

2.1.2 任何类型的指针变量都能存放地址(即使跨类型)

int main()
{
int arr[10] = { 0 };
int* p = arr;
int i = 0;
for (i = 0; i < 10; i++)
{
*(p + i) = 1;
}

return 0;

}

arr:
在这里插入图片描述

p+i:表示下标为i的位置

第一次循环:

p+0,指向不变

第二次:

p+1,指向第一个(跳过一个元素,4个字节)

三 野指针(非法的指针):

野指针概念:-----野狗(属于谁不可知)

指针指向的位置位置(随机/不正确的,没有限制的)

3.1 可能出现野指针的情况:

(1) 指针未初始化:指针里面是一个随机值,解引用会造成非法访问内存

这里的p被称为野指针。

局部变量如果不初始化默认为随机值。

int main()
{
int* p;//p是局部指针变量,p里面随机的值被认为是地址
*p = 20;//对随机值进行解引用操作访问空间,找到一块未知的空间(非法访问内存)
return 0;
}

(2) 指针越界:

越界示例:
在这里插入图片描述

p的指向:
在这里插入图片描述

因为循环进行了11次,i++10次时候,指向的是越界的指针(越界了)

3 指针指向的空间被释放了(已经不属于已有的内存空间)
在这里插入图片描述

*p不合法:因为指向的变量a在内存中已经被释放了(销毁了)。

3.2 如何避免野指针:

1 注意指针要初始化

(1)当指针变量p初始化不知道应该指向谁的时候,定义初始化为NULL(空指针)

(2)明确知道指针变量初始化的值,将某变量的地址赋给指针变量就可

2 小心指针越界

3 指针指向空间释放之后,及时将该指针变量置为空指针

4 指针使用前要检查有效性(使用指针变量时,指针变量不能等于空指针)

四 指针运算:

4.1 指针±整数:

在这里插入图片描述
在这里插入图片描述
*vp++=0:指针变量vp先解引用并且赋值操作后,指针变量再进行更改vp++(指向的位置发生变化),这里的vp++就成为指针变量的加减运算(实质上的指针指向位置的变更)

指针的关系运算(指针变量的高低比较)

在这里插入图片描述
p<=pend是指针的关系运算,p++是指针加整数

4.2 指针-指针:

数组中第九个元素的地址减去第0个元素的地址,得到的结果是9(两者之间元素的个数)
在这里插入图片描述

为什么指针相减得到的是一个整数?

是两指针之间的元素个数

指针相减的前提:是两个指针指向同一块空间

利用指针相减模拟实现strlen库函数实现对数组元素个数的计数:
在这里插入图片描述

那么指针+指针? 没什么意义
在这里插入图片描述

五 数组和指针之间的关系

数组名:就是数组首元素的地址(多个字节中的第一个字节的地址)

在这里插入图片描述

前后一样(p为首元素的地址,p+i就是下标为i的元素的地址)

六 二级指针:

在这里插入图片描述

pa指针变量也是变量,在内存中也有指针变量的地址,&pa也是可行的,取出pa在内存中的起始地址:
在这里插入图片描述

在内存空间中:
在这里插入图片描述
在这里插入图片描述

因此可以有无限级指针(无限套娃)

七 指针数组:存放指针的数组(本质上是数组)

在这里插入图片描述

其他:

指针变量的*靠近变量名称,这样同时定义多个时候不会产生歧义。

(本质上编译器都能识别)

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

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

相关文章

10 个高级 Python 面试问题

随着 Python 最近变得越来越流行&#xff0c;你们中的许多人可能正在接受与 Python 打交道的技术面试。在这篇文章中&#xff0c;我将列出十个高级 Python 面试问题和答案。 这些内容可能会令人困惑&#xff0c;并且针对的是中级开发人员&#xff0c;他们需要对 Python 作为一…

RB-PEG-COOH,罗丹明聚乙二醇羧基化学试剂简介;RhodamineB-PEG-acid

RB-PG-COOH, 罗丹明聚乙二醇羧基 中文名称&#xff1a;罗丹明-聚乙二醇-羧基 英文名称&#xff1a;RhodamineB-PEG-acid RB-PEG-COOH 性状&#xff1a;固体或粘性液体&#xff0c;取决于分子量 溶剂&#xff1a;溶于水和DCM、DMF、DMSO等常规性有机溶剂 分子量&#xff1…

归排、计排深度理解

归并排序&#xff1a;是创建在归并操作上的一种有效的排序算法。算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用&#xff0c;且各层分治递归可以同时进行。归并排序思路简单&#xff0c;速度仅次于快速排序&#xff0c;为稳定排序算法&#…

ICMP隧道技术实现防火墙穿透

1.在mac os的虚拟机里准备三台kali 三台主机ip地址分别是 192.168.1.15&#xff0c;192.168.1.16&#xff0c;192.168.1.17&#xff0c; 为方便描述 依次把他们暂且命名为主机A,主机B,主机C 2.在主机C 上打开终端&#xff0c;输入 cd /usr/local/src 然后新建一个hello.txt 文…

最新版人脸识别小程序 图片识别 生成二维码签到 地图上选点进行位置签到 计算签到距离 课程会议活动打卡日常考勤 上课签到打卡考勤口令签到

技术选型 1&#xff0c;前端 小程序原生MINA框架 css JavaScript Wxml 2&#xff0c;管理后台 云开发Cms内容管理系统 web网页 3&#xff0c;数据后台 小程序云开发 云函数 云开发数据库&#xff08;基于MongoDB&#xff09; 云存储 4&#xff0c;人脸识别算法 基于百度…

xxl-job定时任务调度中心的配置以及整合到自己的项目中实现远程调用

目录 前言&#xff1a; xxl-job配置与启动&#xff1a; xxl-job-admin: xxl-job-execultor--sample-springboot: 启动任务调度中心&#xff1a; ​编辑 调用定时任务&#xff1a; ​编辑 在自己的项目中配置xxl-job&#xff1a; 项目结构&#xff1a; ​编辑 AdUp…

【CSS】更改用户界面样式 ② ( 取消轮廓线 outline | 取消轮廓线设置方式 outline: 0; | 代码示例 )

文章目录一、更改轮廓线 outline二、轮廓线代码示例三、取消轮廓线代码示例一、更改轮廓线 outline 轮廓线 是 元素 边框 外面 的一条线 , 其作用是 选中后突出元素 ; 一般情况下都会去掉 轮廓线 显示 ; outline 样式后可设置 1 ~ 3 个参数 , 按照顺序分别是 : outline-color…

JavaScript-DOM基础

DOM介绍 事件介绍 文档加载 DOM查询 DOM介绍 DOM&#xff0c;全称Document Object Model文档对象模型。浏览器已经提供了文档节点对象 时window属性&#xff0c;可以在页面中直接使用&#xff08;document文档节点代表整个网页&#xff09; <button id "btn&qu…

【Linux 裸机篇(三)】I.MX6ULL 启动方式

目录一、启动方式选择1. 串行下载2. 内部 BOOT 模式2.1 BOOT ROM 初始化内容2.2 启动设备二、镜像烧写1. IVT2. Boot data3. DCD数据一、启动方式选择 I.MX6ULL 芯片上电后&#xff0c;芯片会根据 BOOT_MODE[1:0]的设置来选择 BOOT 方式。BOOT_MODE[1:0]的值是可以改变的&#…

【ONE·C++ || list (一)】

总言 主要介绍list的基本函数使用及部分函数接口模拟实现(搭框架)。 文章目录总言1、常用接口与举例演示1.1、接口总览1.2、部分例子1.2.1、头删、头插、尾删、尾插、遍历1.2.2、pos插入删除、迭代器失效问题1.2.3、一些相对陌生接口简介&#xff08;std::sort和list::sort比较…

D. Captain Flint and Treasure(拓扑排序 + 贪心)

Problem - D - Codeforces 芬特队长参与了另一个寻宝活动&#xff0c;但只发现了一个奇怪的问题。这个问题可能与宝藏的位置有关&#xff0c;也可能不是。这就是为什么弗林特船长决定把解决问题的工作交给他的船员&#xff0c;并提供了一个高得离谱的奖励:休息一天。问题本身听…

【日常】我的扬马最后一小时

文章目录1 Approxmation, Regularization and Relaxation赛前风波惨痛的主场之战释然的痛苦之路后记1 Approxmation, Regularization and Relaxation 在算法理论研究中&#xff0c;为了使得降低问题的求解复杂度&#xff0c;常常会选择牺牲算法的选择求解精度&#xff0c;这种…

Redis-----什么是Redis?

什么是Redis&#xff1f; redis是一个基于内存的key-value结构数据库。 基于内存存储&#xff0c;读写性能高适合存储热点数据&#xff08;热点商品、资讯、新闻&#xff09;企业应用广泛 Redis入门 redis简介 redis是一个开源的内存中的数据结构存储系统&#xff0c;数据库…

ASP宿舍管理系统设计与实现

学生宿舍的管理工作也将成为一项十分繁重的工作&#xff0c;建立一个学生宿舍管理系统是非常必要的&#xff0c;可行的。计算机能够极大地提高学生宿舍管理的办事效率&#xff0c;学校要想与先进科学技术接轨&#xff0c;就得科学化、正规化的进行管理。随着社会信息化步伐的加…

使用Unity模拟人群疏散的资料整理

本文地址&#xff1a;https://blog.csdn.net/t163361/article/details/130136283 UnityDemo Evacuation Simulator Unity_EvacuationSimulator Crowd-Simulation-and-Visualization-in-Unity Multi-agent-simulation-program-for-evacuation Crowd-Evacuation-Simulatio…

Android SQLite插入float类型浮点数小数位数异常(四舍五入过的两位小数变成13位小数)的原因和解决方法

浮点数异常截图&#xff1a; 说明&#xff1a; 正常保留两位小数并正确插入的记录是通过db.execSQL(sql);方法插入的&#xff0c;而浮点数异常的是通过ContentValues db.insert() 方式插入的,可以发现问题出在db.insert()方法上&#xff0c;我又试过在put的时候直接输入类似16…

zabbix代理服务器部署

分布式监控的作用&#xff1a; ●分担 server 的集中式压力 ●解决多机房之间的网络延时问题 部署zabbix代理服务器 1、关闭防火墙、修改主机名 systemctl disable --now firewalld setenforce 0 hostnamectl set-hostname zbx-proxy su 2、设置zabbix的下载源&#xff0c;按…

7.2 模拟乘法器及其在运算电路中的应用

模拟乘法器是实现两个模拟量相乘的非线性电子器件&#xff0c;利用它可以方便地实现乘、除、乘方和开方运算电路。此外&#xff0c;由于它还能广泛地应用于广播电视、通讯、仪表和自动控制系统&#xff0c;进行模拟信号的处理&#xff0c;所以发展很快&#xff0c;称为模拟集成…

【微信小程序-原生开发】添加自定义图标(以使用阿里图标库为例)

方式一 &#xff1a; 下载svg导入 优点&#xff1a;操作方便&#xff0c;支持多彩图标缺点&#xff1a;会增加源代码大小 下载 svg 格式的图标图片&#xff0c;放入源码中使用 小程序项目中的路径为 assets\icon\美食.svg 使用时-代码范例 <image class"imgIcon"…

【JSP学习笔记】3.JSP 指令及动作元素

前言 本章介绍JSP的指令和动作元素。 JSP 指令 JSP指令用来设置整个JSP页面相关的属性&#xff0c;如网页的编码方式和脚本语言。 语法格式如下&#xff1a; <% directive attribute"value" %>指令可以有很多个属性&#xff0c;它们以键值对的形式存在&am…