我正在学习C,现在我撞墙了 . 我很难理解指针 .

想象一下,我有这个代码:

#include

#include

#include

#define DELTA 33

int calls, seed=356;

int sum_ds(int a){

int d=DELTA;

calls++;

return a+d+seed;

}

int main() {

int num;

int *ptr;

int **handle;

num = 14;

ptr = (int *)malloc(2 * sizeof(int));

handle = &ptr;

*(*handle+0) = num;

*(*handle+1) = num+1;

*ptr = num-2;

ptr = #

*ptr = sum_ds(num-2);

}

让我们逐步了解我的理解 .

1 - int调用创建一个名为calls的变量,并不初始化它,因此它包含垃圾 . 它存储在DATA上,假设存储器地址为0xFFAA .

2 - int种子创建一个名为种子的变量,用整数356初始化 . 它存储在DATA上,让我们说内存地址为0xFFAB .

3 - int num创建一个名为num的变量,并且不对其进行初始化,因此它包含垃圾 . 它存储在STACK上,假设存储器地址为0xFFAC .

4 - int * ptr创建一个指向int的指针,并且不为其分配任何地址 . 它存储在STACK上,假设存储器地址为0xFFAD .

5 - int ** handle创建一个指向int指针的指针,并且不为它指定任何地址 . 它存储在STACK上,假设存储器地址为0xFFAE . (很多人在这里烦恼)

6 - num = 14进入地址0xFFAC并在其上存储数字14 . 它是在STACK中完成的 .

7 - ptr =(int )malloc(2 * sizeof(int))在HEAP上,它为2个整数分配了内存大小,第一个内存字节的地址(比如说0xFFZZ)存储在ptr上(在STACK上),所以现在 ptr指向该内存地址 .

8 - handle =&ptr handle现在指向ptr . 我相信它现在指向0xFFZZ上的任何东西(很多人在这里)

9 - ( handle 0)= num指向int指针的指针,现在指定的值为num(14)(很多很多人在这里玩的很多)

10 - ( handle 1)= num 1指针的指针加上一个int,现在它的值被赋值为num 1(15)(很多很多人在这里玩了很多)

11 - * ptr = num-2值ptr指定值为num - 2(12) . 我相信它会进入内存地址0xFFZZ并存储数字12 .

12 - ptr =&num ptr现在指向num,我相信它现在指向0xFFAC .

13 - * ptr = sum_ds(num-2)ptr指向的值是sum_ds的返回值 . 我相信0xFFAC它被分配了401(12 33 356)

这是正确的吗?

java 内存指针_C指针和内存相关推荐

  1. 共享内存 传一个类指针_C++指针

    简介 指针一直是C语言和C++语言最难理解的一部分,无论是C语言和C++语言,复杂的数据结构都是离不开指针的运用,所以必须掌握好指针这个数据类型,你才能够在阅读框架代码时,游刃有余.今天我们从指针的本 ...

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

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

  3. html5 自带video内存泄露_C++ 如何避免内存泄露?

    来源:知乎-张凯(Kyle Zhang) [CPP开发者导读]:内存泄漏是C/C++的一个老生常谈的问题,无论是新手还是有经验的开发者都会在这个问题上栽跟头. 本文向读者介绍了如何避免内存泄漏的方法和 ...

  4. C语言与JAVA内存管理_C语言动态内存管理和动态内存分配

    动态内存管理同时还具有一个优点:当程序在具有更多内存的系统上需要处理更多数据时,不需要重写程序.标准库提供以下四个函数用于动态内存管理: (1) malloc().calloc() 分配新的内存区域. ...

  5. c linux new使内存耗尽_C/C++的内存泄漏检测工具Valgrind memcheck的使用经历

    Linux下的Valgrind真是利器啊(不知道Valgrind的请自觉查看参考文献(1)(2)),帮我找出了不少C++中的内存管理错误,前一阵子还在纠结为什么VS 2013下运行良好的程序到了Lin ...

  6. c# 定位内存快速增长_c#如何避免内存分配瓶颈以提高多线程性能

    我使用C#作为研究工具,经常需要运行CPU密集型任务,例如优化.从理论上讲,我应该能够通过多线程化代码来提高性能,但实际上当我使用与工作站上可用内核数量相同的线程数时,我通常会发现CPU仍然只运行在2 ...

  7. 前向声明 智能指针_C++ 指针类中实现 -gt;*

    C++ 的裸指针是提供 ->* 的运算符的.但 C++ 智能指针目前是不提供 ->* 的运算符的.因为实现起来比较麻烦,而且没有必要.本文来实现一个,需要用到 C++17. 这篇文章本身在 ...

  8. 使用智能指针错误导致内存泄漏_C++智能指针使用的那些事

    指针指针的由来 在C/C++里面,内存管理由开发者自己管理.指针变量总是指向一片内存空间,这片内存空间可以是局部变量.也可以是通过malloc.new申请的.如果申请的内存没有释放,就会导致内存泄漏. ...

  9. 如何释放指针又不影响内存数据_C# 内存机制 - 基础篇

    腾讯面前端暑期实习还有一道让我有点窒息的题目,当时好像是问我C#内存分块底层?我有点不大懂面试官的意思.所以干脆一起总结一下免得无话可说. 1 Overview 首先开宗明义,C#是一种托管语言,它的 ...

最新文章

  1. JS实现——俄罗斯方块
  2. Array的用法总结-swift
  3. html中post语句,html中post乱码的解决方法
  4. WebAudioAPI 入门
  5. 专科python应届生工资多少-应届生学Python年薪30万,秘诀是什么?
  6. 第二个案例实操——创建Bean类
  7. php调用笛风接口,优雅的用PHP来实现解析抖音无水印视频!
  8. 排名 教材 数字电子技术_数字电子技术教材改革及实践
  9. R数据分析:混合效应模型的可视化解释,再不懂就真没办法
  10. 使用 Java 操作 Kubernetes API
  11. 什么是云计算,云计算的三种类型
  12. Windows图片和传真查看器开启故障
  13. Linq分页(skip和Take)
  14. Image Super Resolution Using Conventional Neural Network (SRCNN)
  15. 大规模数据 | RAID | 垂直伸缩水平伸缩 | HDFS
  16. 抖音屏保Java_java编写抖音超火时钟屏保 swing编写
  17. long long类型上限_32位long最大值
  18. Intellij IDEA代码后缀补全
  19. 使用libreswan搭建ipsec点对点隧道 实现两idc内网网段互通
  20. 计算机如何启动远程服务,Win7如何开启远程桌面服务

热门文章

  1. 比特币挖矿成本表_用算力趋势预测减半后比特币挖矿成本价
  2. java怎么实现查找n功能_java 实现微信搜索附近人功能
  3. bzoj3551 [ONTAK2010]Peaks加强版 kruskal重构树
  4. 2017.8.9 老C的键盘 思考记录
  5. 【英语学习】【Daily English】U07 Restaurant L02 I don't think this is what I ordered?
  6. JDK、JRE、JVM的区别与联系
  7. 程序员的自我修养——读《软技能-代码之外的生存指南》笔记
  8. socket套接字TCP API
  9. python 运行时 变量_python运行过程,变量,符号
  10. Metal:对 iOS 中 GPU 编程的高度优化的框架