详解指针(1)(初阶版)

news2024/11/26 4:27:36

前言:本篇是详解指针(1),内容包括:指针是什么,指针和指针类型,野指针

part 1:指针是什么

1 指针就是地址,口语中说的指针通常指的是指针变量

2 指针变量:存放地址的变量

                      我们使用&(取地址操作符)取出变量在内存中的起始地址,将其存入指针变量中

举例:

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

变量a在内存中开辟一块空间用于存放数字10

&a:取出变量a的地址存入指针变量p中

a是int类型,在内存中占4个字节的空间,&a是取出a的4个字节中的第一个字节的地址

int*p 解读: *表示p是一个指针,int 表示指针变量p所指向的类型是int

3 指针的大小

   指针的大小在32位平台上是4个字节,在64位平台是8个字节

part 2:指针和指针类型

指针的定义方式:类型+*

char*pc=NULL;//存放char类型变量的地址
int*pi=NULL;//存放int类型变量的地址
short*ps=NULL;//存放short类型变量的地址
long*pl=NULL;//存放long类型变量的地址
float*pf=NULL;//存放float类型变量的地址
double*pb=NULL;//存放double类型变量的地址

指针类型的意义: 

1.指针+-整数指针的类型决定了指针向前或向后走一步有多大(步长)

举例:

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;
}

定义了字符型指针pc,整型指针pi

将整型变量n的地址存储到指针变量pc和pi中

%p:打印地址

 我们可以看到:pc和pi中都存储了整型变量n,4个字节的第一个字节的地址:006FFDF0

pc+1:006FFDF1         

由于pc是char*类型的指针,故pc+1能够跳过一个char类型,即跳过一个字节,故而pc+1指向了n的4个字节中的第二个字节

pi+1:006FFDF4

由于pi是int*类型的指针,故pi+1能够跳过一个int类型,即跳过4个字节,故而pi+1指向了紧挨着n的那块空间的第一个字节

 

2.指针的解引用:指针的类型决定了对指针解引用的时候有多大的权限(能够操作几个字节)

比如: char* 的指针解引用只能访问一个字节,而 int* 的指针的解引用就能访问四个字节
举例:

int main()
{
    int n = 0x11223344;
    char *pc = (char *)&n;
    int *pi = &n;
    *pc = 0; 
    *pi = 0; 
    return 0;
}

变量n存储一个十六进制的数字:0x11223344,刚好占用4个字节的空间

因为一个十六进制数字的一位对应二进制的四个比特位,即十六进制数字的两位对应二进制的8个比特位,即1个字节

:变量n开辟一块空间存储此数字

char*类型的指针pc和int*类型的指针pi都存储了n的地址

对指针变量pc和pi解引用(*pc,*pi)就能够对n进行修改(即修改变量n中存储的数字)

:指针pc中存储了变量n的地址:0xFBF9AC

 :指针pi中存储了变量n的地址:0xFBF9AC

:*pc:对char*类型的指针pc解引用,只能够访问一个字节的空间(操作修改一个字节),故而修改了变量n中的第一个字节,使之变为0

:*pi 对int*类型的指针pi解引用,能够访问4个字节的空间(操作修改4个字节),故而修改了n变量中的全部四个字节,使之全部变为0

 part 3:野指针

 概念:野指针即指针指向的空间是不可知的(随机的,不正确的)

1. 野指针成因

   a. 指针未初始化

int main()
{
    int *p;//局部变量指针未初始化,默认为随机值
    *p = 20;
    return 0;
}

 指针p中存储的一块空间地址是随机的,对一块不是自己的空间进行修改是非法的

   b. 指针越界访问

举例:

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

 这是arr数组开辟的存放10个整型的空间

 使用整型指针p对数组中的内容进行赋值,0~9

此时arr数组申请的10个整型的空间已经访问结束,但是i还在++

 

 指针变量p此时会发生越界访问,将不属于arr数组开辟的空间内容进行修改赋值

此时的p就是野指针,p超出了arr数组的范围

c. 指针指向的空间释放

    比如

2 如何规避野指针 

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

指针初始化:

若是指针有明确指向,则初始化为确切的地址

int main()
{
	int a = 10;
	int* p = &a;
	return 0;
}

 若是指针没有明确指向,则初始化为空指针NULL

int *p = NULL;

检查指针有效性:

if(p != NULL)
{
    *p = 20;
}

 若是指针不为空指针NULL,则对指针进行操作

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

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

相关文章

shiro721——CVE-2019-12422

这两个漏洞主要区别在于Shiro550使⽤已知密钥碰撞&#xff0c;后者Shiro721是使⽤ 登录后rememberMe {value}去爆破正确的key值 进⽽反序列化&#xff0c;对⽐Shiro550条件只要有 ⾜够密钥库 &#xff08;条件⽐较低&#xff09;、Shiro721需要登录&#xff08;要求⽐较⾼鸡肋 …

Unity基于GraphView的行为树编辑器

这里写自定义目录标题概述基于GitHub上&#xff1a;目前这只是做了一些比较基础的功能节点开发&#xff0c;仅仅用于学习交流&#xff0c;非完成品。项目GitHub连接&#xff1a;[https://github.com/HengyuanLee/BehaviorTreeExamples](https://github.com/HengyuanLee/Behavio…

GNSS 精密钟差产品介绍与DCB改正详解

文章目录前言参考前言 IGS 提供的 GNSS 轨道产品和钟差产品的解算基准并非完全一样, 对于精密产品&#xff0c;各 GNSS 系统的参考基准均为双频无电离层组合&#xff1b;对于广播星历&#xff0c;则区分 GPS 类卫星(GPS,Galileo,QZSS) 基于双频无电离组合的伪距以及 BDS 卫星系…

CAPL(vTESTStudio) - DoIP - TCP发送_05

TCP发送 参数定义 版本号:02 FD or 01 FE or 其他任意值数据类型:00 05 or 00 06 or 80 01 or其他任意值数据长度:想要发送的任意长度

Node.js http 模块详解:request 对象

前言 前文介绍了 http 模块的基本用法&#xff0c;主要就是调用 createServer 和 listen 方法来创建和启动服务。要处理具体的 HTTP 请求&#xff0c;就要在 createServer 方法中写点什么。本文来介绍处理请求的两个核心对象之一的 request 。 URL HTTP 协议最早设计出来&am…

车载TBOX嵌入式设备软件的性能测试

作者 | 李伟 上海控安安全测评中心安全测评部总监 来源 | 鉴源实验室 01 ECU软件和通用软件性能测试的区别 通用软件进行性能测试时通常会通过压力测试、负载测试、稳定性测试、疲劳强度测试、用户并发访问测试等等方法来了解当前软件系统的各项性能指标数据&#xff0c;并在…

【mybatis】实现分页查询

一 .使用原生分页器的实体类 1.1 java代码部分 方法多 不易书写 package cn.bdqn.entity;public class Page {private Integer pageIndex;//页码private Integer pageSize;//页大小 显示多少行数据private Integer totalCounts;//数据的总行数private Integer totalPages;//…

docker安装部署dragonfly2镜像加速服务

Dragonfly安装部署文档 ​ Dragonfly 作为龙蜥社区的镜像加速标准解决方案&#xff0c;是一款基于 P2P 的智能镜像和文件分发工具。它旨在提高大规模文件传输的效率和速率&#xff0c;最大限度地利用网络带宽。在应用分发、缓存分发、日志分发和镜像分发等领域被大规模使用。 …

鸟哥的Linux私房菜读书笔记:Linux磁盘与文件系统管理

系统管理员很重要的任务之一就是管理好自己的磁盘文件系统&#xff0c; 每个分区不可太大也不能太小&#xff0c; 太大会造成磁盘容量的浪费&#xff0c; 太小则会产生文件无法储存的困扰。 前面谈到的文件权限与属性中&#xff0c; 这些权限与属性分别记录在文件系统的哪个区块…

[Golang实战]如何快速接入chatgpt/openai?[引入go-gpt3][新手开箱可用]

如何快速接入chatgpt?[引入go-gpt3]上文介绍了如何在网页使用chatgpt?V1.介绍下在golang中使用chatgpt?1.查看官网推荐的chatgpt项目2.访问go-gpt33.使用并运行在自己的项目中...(是因为例子很难理解,所以一一对应了属性做了配置)3.1安装项目3.2换上自己的代码3.3换上自己的…

LeetCode - 1109 - 航班预定统计

目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 1109. 航班预订统计 - 力扣&#xff08;LeetCode&#xff09; 题目描述 这里有 n 个航班&#xff0c;它们分别从 1 到 n 进行编号。 有一份航班预订表 bookings &#xff0c;表中第 i 条预订记录 bookin…

【C语言】BCD码、十进制互相转换

目录 0. 前言&#xff1a; 1. BCD码 2. 算法原理 3. 进制转换 3.1 两位BCD码的转换&#xff1a; 3.2 其他进制转换 3.3 任意进制转二进制 参考资料&#xff1a; 0. 前言&#xff1a; 记录今天用15单片机写DS1302时钟芯片程序的时候遇到的问题 时间显示是这个样的 0 1…

电源浪涌保护器的演化发展与未来创新方向

随着科学信息技术和城市经济的发展&#xff0c;感应雷、电磁脉冲和雷电波浸入所造成的危害大大增加。一般建筑物的外部防雷措施只能预防直击雷&#xff0c;而强大的电磁场产生的感应雷和脉冲电压却能潜入室内危及电路上的设备。如今通讯网络、电脑仪器和各类用电设备越来越精密…

2023VR视频加密解决方案

如今VR技术在各个领域中的使用&#xff0c;使得我们在日常生活中也可以看到它的身影&#xff0c;常见的就是应用到培训、影院和游戏当中&#xff0c;我们都知道VR视频比传统的平面视频能给用户带来更好的体验&#xff0c;而且现在在教育、娱乐等领域VR类视频也越来越多。相比于…

运动基元(二):贝塞尔曲线

贝塞尔曲线是我第一个深入接触并使用于路径规划的运动基元。N阶贝塞尔曲线具有很多优良的特性,例如端点性、N阶可导性、对称性、曲率连续性、凸包性、几何不变性、仿射不变性以及变差缩减性。本章主要介绍贝塞尔曲线用于运动基元时几个特别有用的特性。 一、贝塞尔曲线的定义 …

C++复习笔记4

编译器给一个类默认生成的六个成员函数&#xff1a; 构造函数、析构函数、拷贝构造函数、赋值运算符重载、对象取地址运算符以及常对象取地址运算符。其中析构函数不能重载&#xff0c;默认的拷贝和赋值两个函数存在浅拷贝的问题。 对象取地址运算符重载和常对象取地址运算符…

KD03丨选品种-横截面动量

大家好&#xff0c;今天我们分享可达鸭系列第3篇策略——横截面动量。 想必这种逻辑大家也都熟悉&#xff0c;为了照顾大部分新人朋友&#xff0c;开始还是简单介绍一下该该逻辑理论。 横截面是一种非时序动量逻辑&#xff0c;从统计学感性描述&#xff08;非严谨客观描述&am…

windows安装PaddleSpeech(无需visual studio)

前言 首先啊&#xff0c;狠狠的批评一下paddle&#xff0c;不想看请直接跳到用法&#xff0c;另外我python版本是3.9&#xff0c;所以包找的也都是3.9。 1.分成许多子项目涵盖AI的不同领域&#xff0c;初心是好&#xff0c;安装起来得安装多个环境。 2.官方文档推荐linux安装&…

anaconda详细介绍、安装及使用(python)

anaconda详细介绍、安装及使用1 介绍1.1 简介1.2 特点1.3 版本下载2 Anaconda管理Python包命令3 安装3.1 windows安装4 操作4.1 Conda 操作4.2 Anaconda Navigator 操作4.3 Spyder 操作4.4 Jupyter Notebook 操作5 示例参考1 介绍 1.1 简介 Anaconda是用于科学计算&#xff08…

力扣sql简单篇练习(十四)

力扣sql简单篇练习(十四) 1 银行账户概要|| 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # 高于相当于大于的意思 SELECT u.name,t.balance FROM Users u INNER JOIN (SELECT account,sum(amount) balanceFROM TransactionsGROUP BY accountHAVIN…