【C语言】让你不再害怕“指针”【c】【知识点整理】

news2025/1/2 2:47:31

目录

一.什么是指针&&为什么需要指针?

1.什么是指针?

2.为什么需要指针?

以一个代码为例观察地址:(这里我们可以通过调试和打印两种方式观察)

1.调试观察:

2.打印观察(地址是用%p 打印):

二.地址编号的来源&&指针变量的大小

产生来源

指针变量大小

三.指针类型  

1.指针都有哪些类型

2.指针类型的意义

1.指针类型决定了指针在解引用时,可以访问多少个字节(即指针的权限)

2.指针类型决定指针在加减1时的步长(即跨过多少字节)

四.野指针

1.野指针的概念:

2.野指针的成因

3. 如何规避野指针

五.指针运算

1.指针加减整数

 2.指针-指针

 3.指针的关系运算

 六.指针和数组

1.指针和数组的关系

2.通过指针遍历数组

七.二级指针


一.什么是指针&&为什么需要指针?

1.什么是指针?

指针是内存中最小内存单元编号,也就是地址

平时口语上说的指针是指指针变量,用于存放地址的变量

2.为什么需要指针?

1.首先,为了管理我们计算机内存,把内存分为很多个小的内存单元,每个内存单元是一个字节

2.为了方便使用这些内存单元,又把每个内存单元都给一个唯一的编号(下面会讲解编号怎么来的),这个编号也称为地址;在C语言中,这个地址也叫指针,所以编号==地址==指针

当我们在写c语言程序时,创建的变量数组等都会在内存中开辟空间;

以一个代码为例观察地址:(这里我们可以通过调试打印两种方式观察)

1.调试观察:

 

这里的操作符是 “&”----->是取地址操作符 ,是个单目操作符

&a 的作用是  把a的地址取出来

2.打印观察(地址是用%p 打印):

 在同一次的程序运行时,我们可以观察到,两种方式观察到的地址是一样的,但是如果我们再次运行时,地址就会发生变化,(如下图:)

这是因为在每次程序运行时,电脑会随机分配地址(这里也不是完全随机,也会考虑一些因素:如该地址是否被占用等因素),所以同一个代码,在每次运行时所分配的地址可能都会又差异;

 


二.地址编号的来源&&指针变量的大小

产生来源

对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的时候产生高电平(高电压)和低电 平(低电压)就是(1或者0); 那么32根地址线产生的地址就会是:

00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000001

...

11111111 11111111 11111111 11111111

一共就有2^32个地址

如果是64位机器上就是2^64个地址

指针变量大小

在32位机器上,一个地址是32位二进制序列,即4个字节大小

在64位机器上,一个地址是64位二进制序列,即8个字节大小

注意:指针变量大小即(4 / 8个字节)只与是多少位机器有关,与变量所指向的内容无关

如:在32位机器上

int  *  p    --------->   p的大小是4个字节

char * p1   -------->   p1的大小是4个字节

short * p2  ------->   p2的大小是4个字节

代码验证:

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
int main()
{

	printf("%d\n",sizeof(int *));
	printf("%d\n", sizeof(char*));
	printf("%d\n",sizeof(short *));

	return 0;
}

结果 


三.指针类型  

1.指针都有哪些类型

                             类型(就是去掉变量名字,剩余的就是类型)

char*  p     ------>  char*

short*  p    ------>  short*

int *  p       ------>  int*

long*  p     ------>  long*

float*  p     ------>  float*

double* p  ------>  double*

等等.......

这里可以看到,指针的定义方式是: type + * 

其实: char* 类型的指针是为了存放 char 类型变量的地址;

short* 类型的指针是为了存放 short 类型变量的地址;

int* 类型的指针是为了存放 int 类型变量的地址

 


2.指针类型的意义

1.指针类型决定了指针在解引用时,可以访问多少个字节(即指针的权限)

讲解的代码:

 

 分析:

从上面的例子我们可以看出:int * 的指针解引用可以访问4个字节

                                               char *的指针解引用可以访问1个字节

我们也可以推出: short * 的指针解引用可以访问2个字节

                              long long  * 的指针解引用可以访问8个字节

结论:

指针类型决定了指针在解引用时,可以访问多少个字节(即指针的权限)

2.指针类型决定指针在加减1时的步长(即跨过多少字节)

讲解代码:

分析:

整型指针加1,跳过4个字节;

字符指针加1,跳过1个字节; 

结论:

指针类型决定指针在加减1时的步长(即跨过多少字节)

如果是    type  *  p      加减n        ,就会跳过sizeof(type)*n 个字节

       例如  int    *  p                                               4    *   n  个字节


四.野指针

1.野指针的概念:

 概念 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

2.野指针的成因

1.指针未初始化

 2.指针越界访问

 

 3. 指针指向的空间释放

 3. 如何规避野指针

 1.指针初始化

当明确知道指针放谁的地址就直接初始化谁的地址;

不知道初始化为谁的地址就暂时初始化为NULL(空指针)

2.防止指针越界;

3.当指针指向的空间释放,即使置为NULL

4.避免返回局部变量的地址

5.指针使用之前检查有效性


五.指针运算


1.指针加减整数

前面在指针类型的意义那有讲解到加减n;

示例:用指针打印数组

 2.指针-指针

指针-指针其实就是地址-地址;

指针-指针的前提是:都指向的是同一块空间

指针-指针得到的数值的绝对值(因为可能为负数)是:两指针之间的元素个数

示例:

 3.指针的关系运算

标准规定: 允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与 指向第一个元素之前的那个内存位置的指针进行比较。(如下面第二个图中代码)

图一:

 图二:

 


 六.指针和数组

1.指针和数组的关系

指针变量就是指针变量,不是数组,指针变量的大小是4  /  8个字节,是专门用来存放地址的;

数组就是数组,不是指针,是一块连续的空间,可以存放一个或多个相同类型的数据;

联系:

数组名是首元素地址(两种特殊情况除外,sizeof(数组名)函数(数组名),数组名是地址,数组名==地址==指针;

2.通过指针遍历数组

当我们知首元素地址时,又因为数组时连续存放的,所以通过指针就可以遍历访问数组;

 证明:

#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]);
    int i = 0;
    for (i = 0; i < sz; i++)
    {
        printf("&arr[%d] = %p   <====> p+%d = %p\n", i, &arr[i], i, p + i);
    }
    return 0;
}

 所以 p+i 其实计算的是数组 arr 下标为i的地址;

 那我们就可以直接通过指针来访问数组;


七.二级指针

是变量就会有地址,一级指针变量也是有地址的,存放一级指针地址的变量就是二级指针

 

 



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

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

相关文章

Vue.js 中的 v-if 和 v-show 有什么区别?

Vue.js 中的 v-if 和 v-show 有什么区别&#xff1f; 在 Vue.js 中&#xff0c;v-if 和 v-show 都是用来控制元素的显示和隐藏的指令。但是&#xff0c;它们之间有一些区别。本文将深入探讨 v-if 和 v-show 的区别&#xff0c;并给出一些相关的代码示例。 v-if v-if 是一种条…

python数据分析模块

python数据分析模块 Python与数据分析的关系数据分析常用模块Python数据分析常用类库1&#xff0e;数组计算的数学模块-Numpy2&#xff0e;Pandas——数据分析核心库3&#xff0e;Matplotlib——绘制数据图表的 Python 库4&#xff0e;批量处理Excel文件的模块-xlwings5&#x…

浮点型在内存中的存储,与整型存储方式竟然不同

对于整形的存储方式&#xff0c;大家可以看我的上一篇文章&#xff0c;这篇文章来介绍浮点型在内存中存储方式。 目录 1. 问题 2. 浮点型家族&#xff1a; 3. 存储方式: 4. 读取方式&#xff1a; 5. 解题 1. 问题 我们先来看一段代码&#xff1a; #include <stdio.h&…

人体姿态估计

预测人体关键点有什么作用&#xff1f; 还原人体姿态&#xff0c;输出脸部、手部的关键点坐标3D空间内&#xff0c;关键点变为3维坐标&#xff0c;可以在三维空间中还原人体姿态&#xff0c;可以实现一键换装恢复3D的人体模型实现下游任务–行为理解&#xff0c;根据姿态判断人…

rocketmq-client-go注册消费者组的问题

一、前言 test环境服务启动&#xff0c;通过代码新注册一个customer group进行消费&#xff0c;服务一直报错如下&#xff1a; levelerror msg"fetch offset of mq from broker error" MessageQueue"MessageQueue [topicxxx, brokerNamebroker-a, queueId1]&q…

字节跳动面试挂在2面,复盘后,决定二战.....

先说下我基本情况&#xff0c;本科不是计算机专业&#xff0c;现在是学通信&#xff0c;然后做图像处理&#xff0c;可能面试官看我不是科班出身没有问太多计算机相关的问题&#xff0c;因为第一次找工作&#xff0c;字节的游戏专场又是最早开始的&#xff0c;就投递了&#xf…

人体关键点检测

title: 人体关键点检测 date: 2023-06-02 21:28:46 tags: [MMPose,cv] 人体关键点检测 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9x4nhwLf-1685714024668)(https://fastly.jsdelivr.net/gh/weijia99/blog_imagemain/1685712470039%E4%BA%BA%E4…

【stm32开发】stm32+oled最小系统板资料(原理图、PCB、示例代码)【六一】

&#x1f389;欢迎来到stm32专栏~stm32oled最小系统板 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;stm32专栏 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大家能…

深度学习训练营之J5周DenseNet+SE-Net实战

深度学习训练营之J5周DenseNetSE-Net实战 原文链接方法介绍SE模块应用分析SE模块的效果对比SE模块代码实现SE模块在DenseNet当中的应用参考内容 原文链接 &#x1f4cc;第J5周&#xff1a;DenseNetSE-Net实战&#x1f4cc; &#x1f368; 本文为&#x1f517;365天深度学习训练…

UART帧格式介绍

UART及通信方式简介 UART Universal Asynchronous Receiver Transmitter 即通用异步收发器&#xff0c;是一种通用的串行、异步通信总线 &#xff0c;该总线有两条数据线&#xff0c;可以实现全双工的发送和接收&#xff0c;在嵌入式系统中常用于主机与辅助设备之间的通信…

Web3 游戏团队如何在项目发布前奠定成功基础——以真实用户支持为核心的运营策略

作者&#xff1a;lesleyfootprint.network 运营 Web3 游戏项目是一项令人兴奋且具有挑战性的任务。无论是对于 NFT 游戏还是链上多人游戏&#xff0c;建立强大且高度参与的用户群体都是游戏成功的关键因素之一。 在本文中&#xff0c;我们将探讨游戏中真实参与和机器人刷量之…

class文件中,常量池之后的相关数据解析!【class二进制文件分析】

前言&#xff1a;前段时间读《深入java虚拟机》介绍到class文件的时候&#xff0c;由于理论知识较多&#xff0c;人总感觉疲惫不堪&#xff0c;就泛泛阅读了一下。在工作中使用起来知识点知道&#xff0c;但是总是需要查阅各种资料。今天有时间&#xff0c;继续整理常量池后面的…

msvcp140.dll丢失的4个解决方法,msvcp140.dll丢失的常见原因

msvcp140.dll是Windows操作系统中的一个动态链接库文件&#xff0c;由Microsoft Visual C程序库所提供。它包含了许多C函数和类的定义&#xff0c;可以为应用程序提供一些基本服务&#xff0c;比如内存管理、文件输入/输出和网络连接等功能。我们在打开游戏或者软件的时候&…

Goby 漏洞更新 |海康威视部分iVMS系统存在文件上传漏洞

漏洞名称&#xff1a;海康威视部分iVMS系统存在文件上传漏洞 English Name&#xff1a;Some Hikvision iVMS file upload vulnerabilitie CVSS core: 9.8 影响资产数&#xff1a;15294 漏洞描述&#xff1a; 海康威视-iVMS综合安防管理平台是一套“集成化”、“数字化”、…

Redis系列----redis网络模型2

一、redis单双线程判断 一、redis单线程定义 主要是指Redis的网络IO和键值对读写是由一个线程来完成的&#xff0c;Redis在处理客户端的请求时包括获取 (socket 读)、解析、执行、内容返回 (socket 写) 等都由一个顺序串行的主线程处理&#xff0c;这就是所谓的“单线程”。这…

VH6501干扰仪的使用

目录 1.VH6501接口介绍 2.使用场景 2.1当VH6501作为硬件接口卡作通信/监测使用时&#xff0c;使用CH1的任意接口与总线连接即可 2.2若将 VH6501 用于干扰总线&#xff0c;针对单节点干扰时则通常情况下接任意一个接口即可 2.3针对多节点干扰时&#xff0c;需要通过CH1的两个…

YCbcr to rgb 笔记

YCbCr 色彩空间的一种 YCbCr或Y’CbCr有的时候会被写作&#xff1a;YCBCR或是Y’CBCR&#xff0c;是色彩空间的一种&#xff0c;通常会用于影片中的影像连续处理&#xff0c;或是数字摄影系统中。Y’为颜色的亮度(luma)成分、而CB和CR则为蓝色和红色的浓度偏移量成份。Y’和Y…

3.4 最大字段和

博主简介&#xff1a;一个爱打游戏的计算机专业学生博主主页&#xff1a; 夏驰和徐策所属专栏&#xff1a;算法设计与分析 1.什么是最大子段和? 我的理解&#xff1a; 最大子段和是一个经典的问题&#xff0c;也称为最大子数组和问题。给定一个整数数组&#xff0c;要求找到…

口撕raft面试100问

1&#xff0c;Raft 协议什么作用 2&#xff0c;详细介绍 Raft 流程 我觉得以下这个流程是比较详细的了&#xff0c; 以下是带上了持久化和日志压缩的细节&#xff1a; 持久化&#xff1a;节点会定期将自己的信息&#xff0c;比如当前任期号、投票信息、日志条目和快照&#…

项目改造操作(图书管理系统为例)

目录 后端 概述 获取所有的读者的借阅卡号 获取所有的未被借阅的图书编号 进行借阅 前端 后端 概述 本模块主要完成对图书的借阅处理。需要实现三个接口&#xff0c;第一个是获取所有的读者的借阅卡号&#xff0c;第二个是获取所有的未被借阅的图书编号&#xff0c;第三…