从C出发 31 --- 指针专题经典问题剖析

news2024/11/18 19:53:59

int a = 0;
int* p = &a;  //p作为指针指向了a, p 保存的是a 变量的内存地址,
    // p 这个指针本质是变量,这个变量有没有内存地址?
    // 有内存地址,为什么?
    // 因为它作为变量,肯定要占用内存空间的
    // p 这个变量的地址如何拿到?
    // 使用取地址操作符作用于 p 这个变量 ------- &p   其结果就是 p 这个变量的内存地址
    // 这个内存地址( &p ) 如何保存?
    // 显然,要保存一个内存地址,只能定义指针?
    // 那么,怎么定义指针指向另一个指针呐?

在 c 语言里面有多级指针的概念,多级指针就是指针。这种指针用来保存其他指针的地址,换句话说,也就是指向指针的指针

Type *   ----   表示一个指针类型 ,    指针类型后面再加一个 * 号,是另一个指针类型,是不同的指针类型,于是,这个 ppv 就是一个指针,这个指针用来指向 这个类型的变量 ---- Type*,而Type*类型的变量是什么?是另一个指针,所以有了这样的初始化写法 ---- Type** ppv = &pv;

使用 pv ,也就是 Type* 类型的变量的地址来初始化 ppv ,这样的话 ppv 是一个二级指针。这个二级指针的本质还是变量,只有是指针本质就是变量

ppv 这个二级指针还是变量,肯定有地址,怎么获得它的地址  -------   &ppv

怎么保存 ppv 这个二级指针变量的地址?

        再定义指针,

        ppv 它的类型是 : Type**     

        它的地址类型是 : 就是 ppv 的类型再加一个 * 号


 

#include <stdio.h>

int main()
{
    int a = 0;
    int b = 1;


    int* p = &a; //定义一级指针 p ,让一级指针p ,指向 a
    int** pp = &p; 定义二级指针 pp,并使得它指向一级指针 p

    **pp = 2;   // a = 2;

    *pp = &b;   // p = &b;

    *p = 3;     // b = 3;

    printf("a = %d, b = %d\n",a, b);
    

    return 0;
}


既然是二级指针,意味着我们调用这个函数的时候,第一个参数必须是   一个一级指针的地址

 就是在函数里面,申请一片堆空间,通过函数外的指针指向这片堆空间

#include <stdio.h>
#include <stdlib.h>

int getDouble(double** pp, unsigned n)
{
    int ret = 0;
    double* pd = malloc(sizeof(double) * n);

    if(pd != NULL)
    {
        printf("pd = %p\n",pd);
        *pp = pd;
        ret = 1;
    }

    return ret;
}

int main()
{
    double* p =NULL;
    
    if(getDouble(&p, 5))
    {
        printf("p = %p\n",p);

        free(p);
    }


}

 我们应用了二级指针,在函数内部改变了函数外部指针变量的值


 b 的类型是什么?

C 语言里面没有多维数组,只有一维数组,我们所看到的多维数组,其实就是数组的数组

 

实验结论 : 一维数组的数组名是一个 一级指针类型

                    二维数组的数组名是一个 也是一个一级指针类型,绝非二级指针类型

 


 

 

#include <stdlib.h>


int* func()
{
    int var = 100;
    
    return &var;
}

int main()
{
    int* p = func(); //OPPS!!!!
                    // p 指向了不合法的地址,这个地址处没有变量存在
                    // p 是一个野指针,保存不合法地址的指针都是野指针 

    printf("*p = %d\n", *p);

    *p = 200;   //改变 func 函数中局部变量 var 的值,是不是非常奇怪???
    
    printf("*p = %d\n", *p);

    return 0;

}

可以定义指针的指针 ,来保存另一个指针的地址

 

 想要在函数返回之后,操作函数内部的局部变量,这显然不合法,因为函数返回之后,局部变量和函数参数都被销毁了,所以返回的地址就不合法了,于是导致我们在main 函数中操作了野指针

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

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

相关文章

第十一章 使用Bind提供域名解析服务

文章目录 第十一章 使用Bind提供域名解析服务一、DNS域名解析服务1、DNS简介2、服务器类型3、13台根DNS服务器的具体信息 二、安装Bind服务程序1、Bind简介2、Bind安装3、关键配置文件4、修改主配置文件5、正向解析实验&#xff08;1&#xff09;、编辑区域配置文件&#xff08…

processing官方教程笔记(附加官网链接)更新中~

官方参考文档&#xff1a;https://processing.org/reference 官网视频&#xff1a;https://www.youtube.com/user/shiffman/playlists?view50&sortdd&shelf_id2 b站up主转载官方视频&#xff1a;https://www.bilibili.com/video/BV147411d7kY?p1&vd_source07ce5c…

【计算机三级网络技术】 第六篇 真题练习

文章目录 IPS&#xff08;入侵防护系统&#xff09;相关知识点蓝牙服务器技术DNS 服务器WWW 服务器FTP 服务器邮件&#xff08;Winmail 邮件服务器&#xff09;生成树协议IEEEVLAN 标识的描述DHCP 服务器 IPS&#xff08;入侵防护系统&#xff09;相关知识点 1、入侵防护系统&…

迪赛智慧数——柱状图(象形标识图):在选择另一半时,你更看重的是?

效果图 好看只排第六&#xff0c;第一确实众望所归&#xff01;当代男女择偶标准出炉&#xff0c;一张图带你看清。 女性挑选另一半时&#xff0c;她们更看重伴侣收入高、职业体面、工作能力强、受教育程度高&#xff0c;还得和自己有共同话题。 男性择偶观和女性恰恰相反&am…

第二届网刃部分WP

第二届网刃部分WP 玩坏的winxp 用VM打开附件时候打不开&#xff0c;后来用DiskGenius软件打开&#xff0c;发现桌面中存在有五张图片 在图片meiren.png中发现有隐藏压缩包 foremost分离文件&#xff0c;发现图片 010查看发现还有一层压缩包&#xff0c;再次分离发现压缩包…

自动售货机程序找零博图程序实现

1、操作界面 2、程序实现 REGION 找零确认 IF #找零确认 THEN //复位 #"50元张数" : 0.0; #"20元张数" : 0.0; #"10元张数" : 0.0; #"5元张数" : 0.0; #"1元张数…

Mysten Labs宣布推出积极贡献者和早期支持者ACES计划

Mysten Labs宣布推出积极贡献者和早期支持者&#xff08;ACES&#xff0c;Active Contributors & Early Supporters&#xff09;计划。这是对进入Sui主网的社区成员所做努力的巨大认可。 如果您在5月3日Sui主网启动之前就加入Sui Discord&#xff0c;请于5月18日凌晨2点&a…

JUC并发编程16 | CAS自旋锁

CAS自旋锁 是什么&#xff0c;干什么&#xff0c;解决了什么痛点&#xff1f;如何解决&#xff0c;如何使用。 原子类&#xff1a;java.util.concurrent.atomic 在没有CAS之前&#xff0c;多线程环境不使用原子类保证线程安全i等操作&#xff0c;会出现数据问题&#xff0c;…

LeetCode特训 -- Week3 (字符串)

目录 字符串基础 字符串基本操作 字符串匹配算法 字符串异位词问题 分组分类问题和快速查找数据结构之间存在一定的关系。 字符串回文串问题 留下悬念&#xff1a;高级字符串算法题目(字符串 dp) 字符串基础 字符串定义&#xff1a;n个字符顺次排列而成的序列. 子串&…

MySQL好玩新特性:离线模式

GreatSQL社区原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本&#xff0c;使用上与MySQL一致。作者&#xff1a;Yejinrong/叶金荣文章来源&#xff1a;GreatSQL社区原创 继续吹MySQL 8.0~ 在以前&#xff0c;当需要对MySQL数…

CVPR 2023 | VoxelNeXt实现全稀疏3D检测跟踪,还能结合Seg Anything

在本文中&#xff0c;研究者提出了一个完全稀疏且以体素为基础的3D物体检测和跟踪框架VoxelNeXt。它采用简单的技术&#xff0c;运行快速&#xff0c;没有太多额外的成本&#xff0c;并且可以在没有NMS后处理的情况下以优雅的方式工作。VoxelNeXt在大规模数据集nuScenes、Waymo…

《编程思维与实践》1064.A-B(Big Integer)

《编程思维与实践》1064.A-B(Big Integer) 题目 思路 两个大整数做减法有可能出现结果为负的情况,因此结构体BIGINT需要补充符号位sign, 因为减法是个位对齐进行操作,为了方便起见,本题还是采用逆序(个位开始)存储. 注意到本题的两个整数均非负,所以不需要考虑转化为加法的情况…

TOOM舆情监测系统:从原理到应用

舆情监测系统是一种可以帮助企业、政府等机构了解公众对自己的看法和态度&#xff0c;提前发现和预测可能出现的危机或负面舆情&#xff0c;从而进行预警和应对的工具。本文将从原理到应用&#xff0c;通过国内具体案例分析&#xff0c;探讨舆情监测系统的相关知识。 一、舆情…

DSP:数字信号处理的原理及应用

什么是DSP&#xff1f;DSP一般有两种解释&#xff1a; 1、Digital Signal Processing&#xff0c;数字信号处理技术&#xff0c;简称DSP。是一门涉及许多学科而又广泛应用于许多领域的新兴学科。数字信号处理是围绕着数字信号处理的理论、实现和应用等几个方面发展起来的。数字…

有哪些好用的AI工具?

现在有很多好用的AI工具&#xff0c;以下是一些常用的&#xff1a; 1. TensorFlow&#xff1a;谷歌开发的深度学习框架&#xff0c;支持多种编程语言&#xff0c;包括Python、C、Java等。 2. PyTorch&#xff1a;Facebook开发的深度学习框架&#xff0c;易于使用&#xff0c;…

干货分享:PCB防静电设计的必要性

平时通过走路穿衣等日常活动带来的摩擦&#xff0c;会产生不同幅值的静电电压&#xff0c;但其能量很小不会对人体产生伤害&#xff0c;不过对于电子元器件来说&#xff0c;这种静电能量却是不能忽视的。 在干燥的环境下&#xff0c;人体静电&#xff08;ESD&#xff09;的电压…

matlab实验二可视化

学聪明点&#xff0c;自己改&#xff0c;别把我卖了 一、实验目的及要求 要求 1、掌握 MATLAB常用的二维和三维绘图函数 2、掌握MATLAB的图形注释 3、熟悉MATLAB常用的图形修饰 4、熟悉MATLAB的图形动画 实验原理 1、MATLAB二维绘图&#xff1a;plot,fplot,fimplicit&#xf…

Matlab 非线性迭代法(2)高斯牛顿法

一、思想 高斯牛顿法的对象是最小二乘法。 采用一定的方法对Hession 矩阵进行近似&#xff0c;这样的话可以减少计算量&#xff0c;只需要计算一阶偏导数得到雅可比矩阵即可。 minF(x)|| f(x)||^2 那么x在xk处的增量Δxk出的最小二乘法为 minF(xkΔxk)∣∣f(xk​Δxk​)∣…

Word处理控件Aspose.Words功能演示:使用 Java 处理 Word 文档的原始版本或修订版本

Aspose.Words是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。 Aspose API支持流行文件格式处理&#xff0c;并…

企业电子招投标采购系统源码之登录页面-java spring cloud

​ 信息数智化招采系统 服务框架&#xff1a;Spring Cloud、Spring Boot2、Mybatis、OAuth2、Security 前端架构&#xff1a;VUE、Uniapp、Layui、Bootstrap、H5、CSS3 涉及技术&#xff1a;Eureka、Config、Zuul、OAuth2、Security、OSS、Turbine、Zipkin、Feign、Monitor、…