• Pointers and Memory


    Stanford CS Education Library #102

    一、Basic Pointers

    指针主要有两个用途:使不同的代码段共享信息、方便链表(树)的处理。
    指针示意图:
    在这里插入图片描述
    dereference操作会根据指针的值去找到它的pointee
    NULL是一个特殊的指针值(一般是地址0),表示这个指针不指向任何pointee
    在这里插入图片描述
    指针的赋值会使得两个指针指向相同的pointee,但pointee本身不会改变:
    在这里插入图片描述
    传指针vs传值:
    在这里插入图片描述
    定义一个指针后,这个指针是没有被初始化的:
    在这里插入图片描述
    这时候如果进行dereference操作会发生Runtime Error.
    对于Java、LISP等语言,当定义一个指针时,系统会将其设置为NULL,并且会在dereference操作时检查其值,这也是Java比较慢的原因之一。
    在这里插入图片描述
    一个比较典型的指针错误:

    void BadPointer()
    {
    	int* p;  //allocate the pointer, but not the pointee
    	*p = 42; //serious RE
    }
    

    当执行*p时:
    在这里插入图片描述

    二、Local Memory

    函数开始运行时,会为局部变量分配内存,结束运行会回收内存。
    看一个错误的例子:

    //TAB -- The Ampersand Bug function
    int* TAB()
    {
    	int temp;
    	return (&temp);
    }
    
    void Victim()
    {
    	int* ptr;
    	ptr = TAB();
    	*ptr = 42;    //The pointee was local to TAB
    }
    

    问题在于TAB()返回了一个局部变量的地址,但这个局部变量的空间已经被回收,ptr指针没有pointee

    三、Reference Parameters

    传值:

    void B(int worth)
    {
    	worth++;
    	// T2
    }
    
    void A()
    {
    	int netWorth = 55;  //T1
    	B(netWorth);
    	// T3 -- B() did not change netWorth
    }
    

    在这里插入图片描述
    传指针:

    void B(int* worthRef)
    {
    	(*worthRef)++;
    	// T2
    }
    
    void A()
    {
    	int netWorth = 55;  //T1
    	B(&netWorth);
    	// T3
    

    在这里插入图片描述
    传指针在c++中可以通过传引用的方式实现:
    在这里插入图片描述

    四、Heap Memory

    分配示意图:
    在这里插入图片描述
    释放示意图:
    在这里插入图片描述
    释放后,指针虽然还在,但却不可以在使用。

    //size以字节为单位,分配成功返回指针,失败返回NULL
    void* malloc(unsigned long size);
    
    //不需要size,因为heap manager之前已经记录过
    void free(void* heapBlockPointer);
    

    在这里插入图片描述
    在这里插入图片描述
    一个StringCopy()的例子:
    在这里插入图片描述
    对于分配的堆内存,只有一个负责释放的,要么是caller,要么是callee
    在这里插入图片描述

  • 相关阅读:
    Yii笔记之filter用法 j神
    [转载]C# 剪切板编程 Clipboard
    [转载]3521工程
    [原创]获取委托链方式,用于多播委托。
    [转载]C#为应用程序注册快捷键 Ctrl+C Ctrl+V
    【原创】序列化/反序列化
    【原创】WinForm操作EXCEL(第三方插件NPOI)
    【原创】MyXls导出Excel (适用于Winform/WebForm)
    【原创】特性与反射(一)
    【原创】特性与反射(二)
  • 原文地址:https://www.cnblogs.com/EIMadrigal/p/12130901.html
Copyright © 2020-2023  润新知