[C语言]初步的来了解一下指针(多图详解)

news/2024/4/19 4:48:33/

       

目录

       

        1.指针是什么

        2.指针类型

        2.1指针类型的意义(+-整数)

        2.2指针的解引用

        3.野指针

        3.1野指针出现的情况

             3.2 如何规避野指针

        4.指针运算

                4.1指针+-整数

                 4.2指针-(减)指针

        5.二级指针       


        1.指针是什么

                指针是内存中最小的单元编号,也就是地址。指针还可以是一种指针变量

                内存:

                当我们平时在创造一个变量后,内存会开辟出相应的空间来存放这一数据,例如在创建一个float变量并赋值后,开辟了四个字节来存放,每一个字节都有相应的地址来对应

                 指针变量:
                我们可以通过&(取地址操作符)取出变量的内存其实地址,把地址可以存放到一个变量中,这个变量就是指针变量

         2.指针类型

                像整型和浮点型都有不同的类型,int,short,float等等,相应的指针也有着不同的类型         

        如下: 

(在定义指针的时候要将其初始化,但如果没有可以指向的变量,一般用NULL空指针表示)

char *pc = NULL;
int *pi = NULL;
short *ps = NULL;
long *pl = NULL;
float *pf = NULL;
double *pd = NULL;

                对于指针的定义可以看出来为:类型 + *

                不同类型的指针来存放不同类型类型变量的地址

                char*类型的指针存放char类型变量的地址

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

                以此类推……

        2.1指针类型的意义(+-整数)

                指针类型的不同除了代之存放变量类型,还可以根据不同类型的字节的不同来进行操作

                举例说明:

                int类型为‘4’字节数

                char类型为‘1’字节数

int main()
{int a = 10;int* pa = &a;char* pc = &a;printf("a=%d\n\n", a);printf("pa=%p\n", pa);printf("pa+1=%p\n\n", pa + 1);printf("pc=%p\n", pc);printf("pc+1=%p\n", pc + 1);return 0;
}

                打印结果:

                对此,我们可以发现:

         同样是+1为什么差别这么大呢?原因就正是在指针类型的不同上,不同字节的指针类型+1所得到的地址是:原地址 + 整数*(sizeof(指针类型))

        char*类型一次访问1个字节,+1跳过1个字节

        int*类型一次访问4个字节,+1跳过4个字节

        可能有人有疑问说:

        Q:为什么int类型的变量的地址可以放到char*类型中呢?

        A:指针变量都是用来存放地址的,类型的不同只是使得他们的意义不同。

        总结:指针的类型决定了指针向前或者向后走一步有多大(距离),这一点在下面解引用也有所体现。


        2.2指针的解引用

                解引用通俗的来说,就是根据地址去寻找所存储的内容

                *pa = a

                但在指针变量的声明或定义中并不是解引用,只是创建一个 (int*)类型的指针变量

                 对于不同的指针类型,对指针解引用的权限也是不同的,这一点跟指针类型的意义中整数的+-有所类似

                 对比两个例子可以看出,char*类型指针只具有一个字节,所以在解引用后只有一个字节的权限,再次赋值时也只能改变一个字节。如果使用char*类型指针想要将a赋值为0,则要循环语句逐一的将四个字节都赋值为0

                而int*类型指针具有四个字节,在解引用后具有四个字节的权限,所以在赋值时可以一次将四个字节都赋值为0。

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

                 在对机器大小端的判别时,就运用到了这个知识点。具体举例在以下文章:

                [C语言]和我一起来认识“整型在内存中的存储”_HY_PIGIE的博客-CSDN博客

 3.野指针

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

        3.1野指针出现的情况

1.指针未初始化

int* p;
*p = 20;

2.指针越界访问

int arr[10] = {0};
int *p = arr;
for(int i = 0;i <= 10;i++)
{*(p++) = i;//当i=10时超出数组的范围,p就为野指针
}

             3.2 如何规避野指针


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

        4.指针运算

                4.1指针+-整数

int arr[9] = {0};
int* pa = null;
for(pa = &arr[0];pa < &arr[9])
{*pa++ = 0;
}

             

                数组为int类型,取得首元素的地址也即为数组的地址。

                获取地址的指针类型为int*(四字节),*运算符的优先级高于++的优先级

                所以先是*pa = 1,赋值后再

                *pa++,地址+1

                因为是int*类型,+1等价于加上四个字节即一个整数位,所以相当跳过一个数组单位

                得出:当i++变化时,pa = arr。有:

                pa+i =arr[i]; 

                 4.2指针-(减)指针

    char arr[] = "abcdef";char* pa = arr;    //数组首元素的地址while (*pa != '\0'){pa++;当没有遇到字符串结尾的‘\0’,就++}int len = pa - arr;//两个指针相减,得到++的差值,便是字符串的长度printf("%d", len);

        5.二级指针       

        指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?这就是 二级指针

        像ppa这种取指针地址的指针称为二级指针。
          5.1二级指针的运算

        

                 本文章目前就到此为止了,如有不对的地方欢迎留言指正。

                谢谢观看

                


http://www.ppmy.cn/news/10117.html

相关文章

【Linux】make/Makefile的使用

本文目录 背景简介 使用方法 为什么执行的指令是make和make clean呢&#xff1f; gcc如何判断文件是否需要重新执行&#xff1f; 背景简介 一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefifile定义了一系列的规则来指定…

学习笔记6:字符串库函数(下)

目录 一. strstr模拟实现 二. strtok模拟实现 三.关于strerror和perror的说明 一. strstr模拟实现 库函数strstr函数首部&#xff1a;char * strstr ( const char *str1, const char * str2); 函数的功能是在str1指向的主字符串中寻找子串str2&#xff0c;并且返回主字符串中…

【经典面试题】

TC经典面试题1.赛马问题 WY经典面试题2.:烧香问题 砝码称重问题 有36匹马&#xff0c;6个跑道&#xff0c;在没有计时器的情况下&#xff0c;至少需要赛马多少次&#xff0c;才能比出前三名&#xff1f; 答案&#xff1a;至少需要比较8次。 解题思路&#xff1a; 先把36匹…

2023年中职网络安全竞赛Windows操作系统渗透测试解析(超详细)

B-12:Windows操作系统渗透测试 任务环境说明: 服务器场景:Server2305(关闭链接)服务器场景操作系统:Windows(版本不详)通过本地PC中渗透测试平台Kali对服务器场景进行系统服务及版本扫描渗透测试,并将该操作显示结果中445端口对应的服务版本信息字符串作为Flag值提交…

c++入门(命名空间+缺省参数+函数重载)

文章目录1. 命名空间1. c语言的两个域2. 命名空间的使用1.类型问题命名空间A和B的实现2. 变量问题3.三种访问方法1.指定命名空间访问2. 全局展开using namespace std 的含义尽量不使用using namespace std的原因3. 部分展开2. 缺省参数(备胎)1. 概念2.全缺省参数3.半缺省参数错…

【07】概率图推断之信念传播

概率图推断之信念传播 文章目录将变量消除视为信息传递信息传递算法加总乘积信息传递因子树上的加总乘积信息传递最大乘积信息传递总结在《概率图推断之变量消除算法》中&#xff0c;我们讲了变量消除算法如何对有向图和无向图求P(Y∣Ee)P(Y \mid E e)P(Y∣Ee)的边缘概率。 …

IDEA启动项目通过https进行访问,nginx配置https访问

一、IDEA启动项目通过https进行访问 1、获取证书 证书申请网络有很多方法&#xff0c;这里腾讯云的nginx版证书举列 2、证书转换 springboot是识别p12证书的&#xff0c;所有这里需要吧pem证书进行转换。转换工具OpenSSL-Win64&#xff08;自行百度下载&#xff09;下载完…

一步步实现React-Hooks核心原理

React Hooks已经推出一段时间&#xff0c;大家应该比较熟悉&#xff0c;或者多多少少在项目中用过。写这篇文章简单分析一下Hooks的原理&#xff0c;并带大家实现一个简易版的Hooks。 这篇写的比较细&#xff0c;相关的知识点都会解释&#xff0c;给大家刷新一下记忆。 Hooks…

回顾2022年的历程,展望2023年目标

这里写目录标题回顾2022年博客之星你参加了吗&#xff1f;学习方面写博客方面在涨粉丝方面展望2023回顾2022年 时间如梭&#xff0c;转眼间已经2023年了。 你开始做总结了吗&#xff1f; 博客之星你参加了吗&#xff1f; 这是 2022 博客之星 的竞选帖子&#xff0c; 请你在这…

非对称加密实战(一):JDK生成keystore获取公钥私钥及代码验证【附源码】

目录使用说明非对称加密生成keystore文件公钥私钥互相解密获取fd-alias.keystore中的公钥私钥使用生成公钥私钥进行解密源码地址使用说明 非对称加密 非对称加密算法主要有&#xff1a;RSA、Elgamal、背包算法、Rabin、D-H、ECC&#xff08;椭圆曲线加密算法&#xff09;。下…

JEECGboot数据规则篇

使用 一、功能说明 列表数据权限&#xff0c;主要通过数据权限控制行数据&#xff0c;让不同的人有不同的查看数据规则&#xff1b; 比如&#xff1a; 销售人员只能看自己的数据&#xff1b;销售经理可以看所有下级销售人员的数据&#xff1b;财务只看金额大于5000的数据等等…

flex布局

flex布局 以下6个属性设置在容器上 flex-direction &#xff1a;主轴的方向 flex-wrap &#xff1a;一条轴线排不下&#xff0c;如何换行 flex-flow justify-content &#xff1a;项目在主轴上的对齐方式&#xff08;水平轴&#xff09; align-items &#xff1a;项目在交叉轴上…

数据在内存中存储☞(超详解)

目录 一.数据类型大家族 1.了解类型的意义 2.数据类型大家族的分类 二.详解☞数据储存之整形 1.储存方式 &#xff08;1&#xff09;.原码反码补码的概念 &#xff08;2&#xff09;.原码反码补码出现的原因&#xff1a; 计算机中只有加法器没有减法器&#xff0c;所有只…

python数据分析:采集分析岗位数据,看看薪资的高低都受什么因素影响呢

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 在我们学习的时候,通常会产生疑问:这个行业前景好不好呢? 今天我们就用python的数据分析这个就业方向来举例 看一下都有哪些因素影响了薪资的高低呢&#xff1f; 数据采集 模块使用: reques…

VMware Workstation安装ESXI8.0

&#x1f388; 作者&#xff1a;互联网-小啊宇 &#x1f388; 简介&#xff1a; CSDN 运维领域创作者、阿里云专家博主。目前从事 Kubernetes运维相关工作&#xff0c;擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护…

php学习笔记-php运算符,类型转换,打印输出语句相较于其他语言的特殊部分-day02

php运算符&#xff0c;类型转换&#xff0c;打印输出语句相较于其他语言的特殊部分php运算符php的类型转换php打印输出语句php运算符 1.php运算符与其他高级语言相同的部分 算术运算符&#xff08;&#xff0c;-&#xff0c;*&#xff0c;/&#xff0c;%&#xff09;&#xff0…

进程间的8种通信方式

进程之间的通信方式有&#xff1a; 无名管道( pipe )、高级管道&#xff08;popen&#xff09;、有名管道&#xff08;named pipe&#xff09;、消息队列( message queue )、信号量( semophore ) 、信号 ( sinal ) 、共享内存( shared memory ) 、套接字( socket )。 1、无名管…

网络爬虫的危害与防御方法

爬虫程序是一种计算机程序&#xff0c;旨在通过执行自动化或重复性任务来模仿或替代人类的操作。爬虫程序执行任务的速度和准确性比真实用户高得多。爬虫程序在互联网上扮演着各种各样的角色&#xff0c;超过一半的网络流量是由爬虫程序产生的。有些爬虫程序非常有用&#xff0…

图形管道(投影,mvp)

1.坐标空间 •图形管道对3D空间中的场景进行了描述&#xff0c;并将其映射到显示空间上的2D投影。 2.本地坐标系&#xff08;LCS&#xff09; •存储多边形的顶点针对网格对象某个点位于&#xff0c;上或在物体附近 •促进建模灵活性: 转换LCS以生产基本对象形状;将坐标框架放…

STM32MP157驱动开发——Linux IIO驱动(上)

STM32MP157驱动开发——Linux IIO驱动&#xff08;上 &#xff09;0.前言一、IIO 子系统简介1.iio_dev 结构体2.iio_dev 申请与释放3.iio_dev 注册与注销4.iio_info5.iio_chan_spec二、驱动开发1. ICM20608 的 IIO 驱动框架搭建2.IIO 设备申请与初始化3.基于以上驱动框架开发 I…