参考:多级指针(静动态内存的跨函数访问)
作者:枕上
发布时间:2021-07-15 00:27:17
网址:https://blog.csdn.net/jinchi_boke/article/details/118724993?spm=1001.2014.3001.5501

目录

  • 多指针初认识:
  • 动态内存和多级指针的跨函数访问
  • 动态内存和静态内存的比较:
  • 静态内存不可以跨函数访问:
  • 动态内存跨函数访问:

多指针初认识:

#include <stdio.h>
#include <stdlib.h>
int main()
{int i = 100;int *p = &i;int **q = &p;int ***r = &q;//r = &p;   //error 因为r是 int*** 类型,r只能存放 int** 类型变量的地址printf("i = %d\n",***r);   system("pause");return 0;
}

输出结果:

i = 100

动态内存和多级指针的跨函数访问

#include <stdio.h>
#include <stdlib.h>void f(int **p)
{*p = 10;
}int main()
{int *p = (int *)malloc(4);f(&p);  printf("*p = %d\n",p);system("pause");return 0;
}

输出结果:

*p = 10

动态内存和静态内存的比较:

静态内存是由系统自动分配,由系统自动释放

静态内存是在栈分配的

动态内存由程序员手动分配,手动释放

动态内存是在堆分配的

静态内存不可以跨函数访问:

通俗说就是:当被调用的函数结束后,被调用函数里面的静态内存不能被其他函数访问。

#include <stdio.h>
#include <stdlib.h>void f(int **q)
{int i = 10;//*q等价于p  q和**q都不等价于p//*q =i;//error 因为*q = i等价于p = i;这样写是错误的*q = &i;   //等价于 p = &i;
}int main()
{int *p;f(&p);printf("%d\n",*p);  //本语句语法没有问题,但是逻辑上有问题system("pause");return 0;
}

输出结果:

10

这个程序运行是能正常输出的,但是程序是错误的,逻辑上有错误。

因为当 f( ) 函数执行完毕之后,函数终结(也就是函数的出栈),此时函数静态分配的变量的空间会被全部释放,静态变量的空间访问权限会还给操作系统,我们不能再对他进行读写操作。具体到这个 f( ) 函数就是 ,变量 q 没了,变量 i 没了, i 的值 10 也没有了。也可以说 p 指向 的 变量 i 的空间没了。

那么main 函数 就不能访问 i 的值,也就是 printf("%d\n",*p) 中的 *p 逻辑上是不可以的。

但是 指针P 可以存放着 i 的地址。但是不能访问 i 的空间,没有权限进行读写操作。

动态内存跨函数访问:

malloc堆分配的动态内存,不会随着函数的结束而被释放,只有手动free才会被释放

#include <stdio.h>
#include <stdlib.h>void f(int **q)
{*q = (int *)malloc(sizeof(int));  //等价于 p=(int *)malloc(sizeof(int)) //q = 10;    //error//*q = 10;   //等价于  p = 10;**q = 10;    //等价于 *p = 10;
}int main()
{   int *p = (int *)malloc(4);f(&p);    printf("*p = %d\n",*p);system("pause");return 0;
}

输出结果:

*p = 10

多级指针和静动态内存的跨函数访问相关推荐

  1. 关于用函数指针参数申请动态内存的问题

    今天在写一个Binary Search Tree的程序时,发现其插入有问题,下面是插入程序,每次插入完成后,节点还是NULL. template<typename Object> void ...

  2. c语言链表错误,C语言创建链表错误之通过指针参数申请动态内存实例分析

    本文实例讲述了C语言创建链表中经典错误的通过指针参数申请动态内存,分享给大家供大家参考之用.具体实例如下: #include #include // 用malloc要包含这个头文件 typedef s ...

  3. 使用指针数组+申请动态内存实现英文单词排序

    在实现这一目标前我们首先得知道什么是指针数组和动态内存 1.指针数组 在C语言和C++等语言中,数组元素全为指针变量的数组称为指针数组,指针数组中的元素都必须具有相同的存储类型.指向相同数据类型的指针 ...

  4. 学了指针没学动态内存一切都白搭!C语言基础教程之内存管理

    本文将讲解 C 中的动态内存管理.C 语言为内存的分配和管理提供了几个函数.这些函数可以在<stdlib.h>头文件中找到. 在内存中动态地分配 num 个长度为 size 的连续空间,并 ...

  5. python 指针_C++的动态内存:C++的指针

    在C++里,指针(pointer)变量被用来存储内存地址.C++要求使用特定的类型来定义指针.这个类型被用来指示需要如何去解释内存地址里的数据.我们已经知道,在计算机的内部,内存存储的是1和0,而C+ ...

  6. c语言函数申请内存,c中动态内存申请的函数

    C语言中,内存管理是通过专门的函数来实现的. (1)malloc函数: 用于分配若干字节的内存空间,并返回一个指向该内存空间首地址的指针变量. 若系统不能提供足够的内存单元,将会返回一个NULL,空指 ...

  7. 2021.11.18 动态内存中free函数

    1. 回顾动态内存基础知识 #include<stdio.h> #include<stdlib.h> int main() {//动态开辟 10个空间 intint *p = ...

  8. 如果函数的参数是一个指针,不要指望用该指针去申请动态内存。

    /*栈类型*/ typedef struct Node {ElemType data;struct Node *next; }Node,*LinkStackPtr;typedef struct Lin ...

  9. C++ Primer 5th笔记(chap 12 动态内存)智能指针概述

    1. 对象的生存期 内存类型 定义 分配和销毁时机 全局对象 程序启动时分配,程序结束时销毁 静态内存 局部static对象类static数据成员 第一次使用时分配,程序结束时销毁 栈内存 定义在函数 ...

最新文章

  1. XPath与多线程爬虫
  2. SELECT-OPTIONS对象
  3. Linux C编程中的段错误
  4. 关于前后端分离我的理解
  5. 第一个 Windows 应用程序
  6. 关于线性字符串匹配的算法-----KMP的算法
  7. Remove Untagged Images From Docker
  8. Matlab2017a(64位)安装包下载及详细安装步骤
  9. c++ 在内存中加载 exe/dll (不使用CreateProcess、LoadLibrary 等 API)
  10. Fiddler抓包(Android app)
  11. Excel学习日记:L4-资料排序
  12. Android Google Play 支付SDK接入指南
  13. c语言程序运行结果怎么看,c语言程序的运行结果.ppt
  14. win10重装系统后无法联网
  15. 我酸了,曝光几个腾讯 阿里P8前同事的副业收入
  16. linux过滤目录文件,SCP使用技巧-递归排除文件
  17. Python之列表(学习笔记)
  18. Hdoj 2188.悼念512汶川大地震遇难同胞——选拔志愿者 题解
  19. xmind可以画流程图吗_Xmind制作流程图教程 xmind怎么画流程图?xmind画流程图步骤...
  20. 用xcode编译c++代码

热门文章

  1. 好程序员HTML5前端教程-css的引入方式和选择器
  2. C/C++中对链表操作的理解实例分析
  3. python 操作RabbitMQ
  4. Docker热点文章链接 - 持续更新
  5. Java集合框架(3)
  6. bundlefusion论文阅读笔记
  7. 圆环内外圆毛刺(凸起)缺口(凹陷)检测halcon
  8. HALCON示例程序measure_screw.hdev螺纹尺寸测量
  9. HALCON示例程序distance_transform.hdev通过distance_transform检测线的缺陷
  10. 学习笔记(06):Python网络编程并发编程-在简单套接字基础上加上通信循环