精华内容
下载资源
问答
  • 打造自己的游戏修改器和内存补丁

    千次阅读 2006-10-02 17:36:00
     1、其实修改器原理很简单,一般来说,在游戏运行的时候我们对游戏内存空间中必要的数据进行修改就可以了。举个例子来说,一款拳皇模拟器里游戏人物的“血”地址是&H567DC0,当这个人物挨打的时候,这个地址数据...
       相信很多人打游戏的时候都用修改器,这里我介绍怎样用VB编写修改器。      
    

        1、其实修改器原理很简单,一般来说,在游戏运行的时候我们对游戏内存空间中必要的数据进行修改就可以了。举个例子来说,一款拳皇模拟器里游戏人物的“血”地址是&H567DC0,当这个人物挨打的时候,这个地址的数据就要减少,只要我们把这个数据再改回去,人物的“血”就有了。要是我们作一个循环,不断地保持这个地址得数不变化,这个人就“百战不殆”了。  :)       

        2、但是我们怎么查找这个关键的地址哪?可以用游戏修改器嘛,比如金山游侠,GM之类。至于要改的数据也同样啦。   

        3、程序的流程:     首先用FindWindow函数查找到游戏窗口,再用GetWindowThreadProcessId获得进程标识符,然后用OpenProcess函数取得游戏进程句柄,最后WriteProcessMemory把数据写到相应的地址。要是需要读数据,用ReadProcessMemory函数就可以了。 我在这里以修改变脸王为例来说明。具体进入下面的链接。 

    值得注意的2个问题:  

        1、无法使用FindWindow函数怎么办?      FindWindow函数需要提供窗体的标题才可以使用,但是有些游戏很难做到这一点。比如抢滩登陆,它的窗口标题很难查找到,还有一款日本鸟游戏,窗口标题是日本话,根本打不出来。碰到这种情况怎么办哪?      比较正式且常见的方法是逐条查找当前所有的进程,找出来游戏进程就找到游戏进程句柄了。这种方法别的地方都有介绍。我这里介绍一种比较笨但比较简单的方法。      由于GetForegroundWindow可以找到桌面最上方的窗口,所以我们只要设定一个时间,比如在程序中设定3秒钟,让用户在3秒钟以内进入游戏界面,我们在3秒以后在调用这个函数,获得的自然就是游戏进程了。呵呵....      下面有一个例子来演示这个原理。  

        2、查出的地址不断变化怎么办?      有些游戏数据的保存地址是随机变化的,比如红色警戒的金钱,这次查出来的地址是这个,下次不知道是什么,这种问题遇到后你就不知道应该修改的内存地址。碰到这种情况怎么办哪?      这种问题需要利用动态调试来解决。我这里拿红色警戒来说明一下原理,其他情况也类似。红色警戒的金钱存放的地址是不断变化的,但是这个地址是由一个确定的地方产生的,就是说程序中有一个确定的地方,这个地方每次随机产生一个地址,程序就把金钱放到这个地方。我们只要找到那个地址来源就好办了。      但怎么找那个地方哪?先进入游戏,用金山游侠查出来钱的地址,比如说是c16a0450H。然后F5调入TRW2000,下命令bpm  c16a0450  w ,就是说当程序写c16a0450H内存地址的时候中断。在这个中断的地方比如说有一个包含[eax]的命令(具体命令我忘记了,你再查一下吧),然后查看d  [eax] ,如果看到这里是c16a0450,那就说明找到地址来源了。把这个地址记下来,但是我们编写程序的时候仍然无法读取[eax],这就需要使用SMC(self modify code)技术,可以编写一个补丁,在这个地址处写一个跳转,跳到另外一个地方,把[eax]的内容写入一个固定的内存地址,比如说 mov  005a627b,[eax]  ,这样写游戏修改器的时候就可以用ReadProcessMemory直接读005a627b的内容,这个内容就是钱的地址了。以后的修改方法就按照上面介绍的方法修改就可以了。     我没写过这样的程序,只不过动态调试了一下,实践证明这种方法是可行的。你要是不知道SMC之类的,可以去www.pediy.com的论坛里问一问,并不是太麻烦。

    关于内存补丁的问题:   

        内存补丁和游戏修改是一样的。用这种方法编写的内存补丁有很多好处:   

        1、可以摆脱一些加壳软件的干扰,比如Asprotect加密过的软件没法作内存补丁,因为它有一个anti-debug功能;    

        2、对于一些光盘上的文件有效,通用的内存补丁一般都要求把补丁程序和软件放在同一个目录中,但是如果从光盘上安装软件,你就无法把补丁放入光盘中,但是自己编写补丁就不存在这个问题了;     

        3、当然是锻炼自己的能力了,呵呵。我的表达能力不好,有什么不懂得地方可以和我探讨一下,不过一般来说我可以给你解释一下,但我不会看你的代码,因为我现在实在没功夫了。下面我给出一些代码,一个是变脸王的内存补丁,还有一个修改窗口标题的程序,都是用VB写的。不要说我没有把所用的控件列出来,要是你连这都不知道也就不用看了。 :)  附件为VB代码。

     
    展开全文
  • 变量和数据类型

    2018-07-07 20:26:49
    什么是程序? (程序是为解决某个特定的问题而用计算机语言所编写的...即数据对应的十六进制的内存地址>; b.存入的数据能否修改)。写程序就是在做内存存取,先把数据存入内存,需要的时候取出来做处理。内存...
    一、什么是程序?
        (程序是为解决某个特定的问题而用计算机语言所编写的指令的集合)
    二、什么是数据结构?
        (计算机存储和组织数据的一种方式,内存就像储物柜,用来存放各种类型的数据.对于程序员来说,数据存入内存只是第一步,还要考虑:a.怎样找到存入的数据?<即数据对应的十六进制的内存地址>; b.存入的数据能否修改)。写程序就是在做内存存取,先把数据存入内存,需要的时候取出来做处理。
        1.内存地址不好记怎么办?
            为特定地址的内存起个别名,通过别名找到存储的数据,该别名就是变量名。变量就是数据存储空间的表示(本质上讲就是内存中的一块存储区域,通过变量名就可以访问此区域)
        2.变量的声明和使用
            a.声明一个变量以分配空间(根据数据类型来开辟空间,如 int a;占4个字节)
            b.为变量赋值(将数据存入空间,如 a = 20;)
            c.使用变量(取出数据,使用。如:System.out.println(a);<根据变量a就可以找到该区域存储的数据>)
        3.标识符命名规则
            (1).什么是标识符:凡是在程序中起名字的地方都可以称之为标识符. 

            (2).变量名不能以数字开头,不能包含关键字,要见名知意.具体参看预科知识.

    三、关键字
        1.关键字的定义和特点
            1)定义:java 语言赋予特定含义的英文单词
            2)特点:所有的字母都为小写
        2.用于定义数据类型的关键字
            class interface byte short int long float double char boolean void
        3.用于定义数据类型值的关键字
            true false null
        4.用于定义流程控制的关键字
            If else switch case default while do for break continue return
        5.用于定义访问权限修饰符的关键字
            private protected public
        6.用于定义类、 函数、 变量修饰符的关键字
            abstract final static synchronized
        7.用于定义类与类之间关系的关键字
            extends implements
        8.用于定义建立实例及引用实例、 判断实例的关键字
            new this super instanceof
        9.用于异常处理的关键字
            try catch finally throw throws
        10.用于包的关键字
            package import
        11.其他修饰符关键字
            native strictfp transient volatile assert
    四、标识符
        1.标识符的定义
            用来作为标识的一种符号, 在程序中自定义的一些名称。 (包括: 包名、 类名、 变量名、 方法名)
        2.标识符的组成
            1)由 26 个英文字母大小写、 数字(0-9)、 符号(_ 、 $)组成。
            2)命名规则(不能违反):不能以数字开头、 不能是关键字
            3)java 中严格区分大小写
            4)命名规范(要遵守的):见名知意
            5)驼峰式命名法 myEnglishScore
            6)匈牙利命名法 my_english_score
        3.java 中的名称规范
            1)包名:多单词组成时所有字母都小写(xxxyyyzzz)
            2)类名:首字母大写(XxxYyyZzz)
            3)变量名和函数名:多单词组成时, 第一个单词首字母小写,第二个单词开始每个单词首字母大写(驼峰式命名法)
            4)常量名:所有的字母都大写, 多单词时每个单词下面用_连接(XXX_YYY_ZZZ)
            5)String(字符串):凡是用双引号引起来的都是字符串 如:String name=” 张三” , 这里的 String 是数据类型, name 是标识符。 注意: 任何其他的数据类型+字符串, 都将变成字符串
     。

    五、Java数据类型

         java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存中分配了不同大小的内存空间.(基本数据类型存的是内容,而引用数据类型存的是地址)

        栈内存:用于存放此方法调用过程当中的临时变量,如:基本数据类型
        堆内存:一般存放new出来的对象,即引用类型
        自动类型转换也叫隐式转换(Implicit Casting):一般为小转大
        强制类型转换也叫显示转换(Explicit Casting):一般为大转小

        单独使用++的时候不管其在前还是在后,都是自身加1;当有赋值运算符的时候,++在后先赋值,再自身加1,++在前,先自身加1,再赋值.

    六、 变量与常量
        1.什么是常量?
            在程序运行时, 不会被修改的量。 (如:20,90.5...)
        2.什么是变量?
            1)概念: 存储数据的基本单元(本质:数据存储的空间表示)。即,
                (a)java 内存中的一个存储区域
                (b)该区域有自己的名称(变量名)和类型(数据类型)
                (c)该区域的数据可以在同一类型范围内不断变化
           2)变量名的本质:内存地址的别名。
           3)为什么要定义变量?
                用来不断地存放同一类型的常量, 并可以重复使用。
        3.变量的声明
            声明的结构: 数据类型 标识符
            比如: String name;

        4.变量的赋值
            比如: name = “小明” ;
        5.变量的定义(声明的同时并初始化)
            相当于变量的声明+变量的赋值
            比如: String name = “孙” ;
            注意:Java 是一种强数据类型的语言, 所以我们在存储数据的时候一定要定义数据的类型。
        6.变量的使用
            方法一:先声明, 再赋值

            方法二:变量的定义(即声明的同时并初始化)

    七、 基本数据类型
        java 中的数据类型分为基本数据类型(8 种)和引用数据类型(如: String)
        1.数据类型
            1)定义:用来确定存储在内存中的数据的类型(注意:变量开辟的内存空间的大小是根据数据的类型来确定的)
            2)为什么一定要数据类型?
                因为 java 是一种强类型的编程语言。 所有的变量必须先定
    义后使用, 所有变量都必须指定一种数据类型。
        2.分类
            1)数值类型
                整型(默认值是 int)   浮点型(默认值是 double)
            2)字符类型
                注意: 使用的时候要用单引号引起来的单个字符(如: ’ A’ 、‘男’ 、 ’ 1’ )
             类型     占用字节数       位数         取值范围
             byte      1 字节             8bit         -128-127
             short     2 字节             16bit      -32768-32767
             int         4 字节             32bit      -2^31-2^31-1
             long      8 字节             64bit      -2^63-2^63
             float      4 字节             32bit
             double  8 字节             64bit
             char       2 字节            16bit       0-65535

            3)布尔类型(boolean):一般用来判断逻辑条件

            类型 占用字节数 位数
              true 1 字节 8bit
              false 1 字节 8bit

    八、 基本数据类型之间的转换

            1.前提条件:两种类型要兼容
            2.转换规则
                1)当占字节数少的类型赋值占字节数大的时候(即:小转大:自动转换)
                    比如: byte num1=15;   int num2=num1;
                2)当占字节数大的类型赋值给占字节数小的类型的时候(即:大转小:强制转换)
                    比如: int num1=1;    short num2=(short)num1;
            总结:
                1.自动类型转换是安全的, 强制类型转换可能导致精度的损失。 一个式子的类型由最高的数据类型决定。
                2.char 的存储类型是十进制, 表现形式是字符, 对应的关系
    查询 unicode 码表。 此外, 在用 char 做运算的时候, 用的是十进制; 做字符串的拼接的时候用的是表现形式。
    九、 输入语句(scanner)
        步骤:
            1.导包:import java.util.Scanner;或者 import java.util.*;
                注意:lang 包下的类使用的时候不需要导包, 其他包下的类在使用的时候都需要导包。
            2.创建 Scanner 对象
                //创建用于从键盘输入的对象, 可以反复使用
                    Scanner input = new Scanner(System.in);
           3.
    四种最常用的数据类型的输入方法
                 Scanner input = new Scanner(System.in);
                    //获取一个整型
                int i = input.nextInt();
                    //获取一个 double
                double d = input.nextDouble();
                    //获取一个字符串
                String string = input.next();
                    //获取一个字符

                char c = input.next().charAt(0);

    十、 基本数据类型的包装类
        基本数据类型 对应的包装类(引用数据类型)
        byte                 Byte
        short                Short
        int                    Integer
        long                 Long
        float                 Float
        double             Double
        char                 Character
        boolean           Boolean
    1.基本数据类型最实用的作用就是用于基本数据类型和字符
    串类型之间的转换

        (1)整数与字符串之间的转换
            a)整数转换为字符串
                ①用连接符: +
                    int num = 123;
                    String str = num + “12” ;

                ②用包装类:Integer.toString(num);
                    int num = 123;
                    String str = Integer.toString(num);
            B)字符串转换为整数
                    Integer.parseInt(String s);
                    String str = “121” ;
                    Int num = Integer.parseInt(str);
        (2)小数与字符串之间的转换
            a)小数转换为字符串
                    Double.toString(double d);
                    double num = 2.5;
                    String str = Double.toString(num);
            b)字符串转换为小数
                    Double.parseDouble(String s);
                    String str = “12.5” ;

                    double num = Double.parseDouble(str);

    十一、 算术运算符
        1.+ 的作用

            (1)做加法 (2)做正号, 表示正数(一般省略不写) (3)做字符串的拼接

              字符串+任何数据类型=字符串类型
                System.out.println("" + 1 + 2);// 12
                System.out.println(1 + "" + 2 + 3);// 123

                System.out.println(1 + 2 + "" + 3);// 33

        2.- 的作用
            (1)做减法 (2)表示负数
        3.* 的作用
            做乘法, 乘号不可以省略
        4./ 的作用

            (1)取整 注意:除号两边如果都是整数, 则结果就是整数; 只要有一边为小数, 结果就做除法运算。

            System.out.println(5 / 2);// 2
            System.out.println(5 / 2.0);// 2.5
            System.out.println(5 / 0);// 0 不能做分母
            System.out.println(5 / 0.0);// Infinity(无限趋近于0,但是不等于 0)

            System.out.println(5 * 0.0);// 0.0

        5.% 的作用
            (1)取余(取模)
                System.out.println(5 % 2);// 1

                System.out.println(5 % 2.0);// 1.0

        6.++ -- 的作用

        (1)单独存在的时候, 在前或在后都是自增(或自减)1

            int i = 1;
            i++;

            System.out.println(i);// 2

            int i = 1;

            ++i;

            System.out.println(i);// 2

       (2)不单独存在的时候, 在前先自增(或自减)先赋值, 再执行其他语句; 在后先赋值, 先执行其他语句, 再赋值。

    int a = 1;
    System.
    out.println(a++);// 1
    System.out.println(a);// 2
    System.out.println(++a);// 3

    System.out.println(a);// 3

    ----------------------------------------------

    int a = 1;
    int b = ++a;
    System.
    out.println(b);// 2

    System.out.println(++a);// 3

    ----------------------------------------------------

    int x = 1;
    System.
    out.println("num=" +
    (x++) + (++x));
    // num=13 

    十二、 包装类
        包含每种基本数据类型的相关属性, 如: 最大值、 最小值等, 以及相关操作的方法。 主要用来和字符串进行转换
        1.利用包装类求整数的最大值和最小值
        
    byte maxValue = Byte.MAX_VALUE;
    byte minValue = Byte.MIN_VALUE;
    System.
    out.println(maxValue);// 127
    System.out.println(minValue);// -128
        2.利用包装类求浮点数的最大值和最小值 
    double maxValue = Double.MAX_VALUE;
    double minValue = Double.MIN_VALUE;
    System.
    out.println(maxValue);
    System.
    out.println(minValue);
    十三、 运算符
        1.赋值运算符
    short s = 2;
    s += 2;
    // 不会报错, 因为+=java 中有强转的作用
    s = s + 2;// 需要强制类型转换 s=(short) (s+2);
    System.out.println(s);
    2.运算符的优先级
        算术运算符>比较运算符>逻辑运算符>赋值运算符(小括号的优先级最高)
    十四、 特殊运算符(三目运算符)
        1.格式: (条件表达式)?(表达式 1):(表达式 2);
        如果条件表达式的值为 true, 运算后的结果为表达式 1。 如果条件表达式的值为 false, 运算后的结果为表达式 2
        比如
    :
            int x = 3, y = 4, z;
            z = (x >
    y) ? x : y;
            System.
    out.println(z);
        2.优点与缺点
            可以简化 if-else 代码。 因为它是一个运算符, 所以运算必须要有一个结果。
    十五、 比较字符串
        1.==
            对于基本数据类型来讲, 比较的是是否是同一个对象(即是否引用同一个地址)
        2. .equals()
            比较的是指向对象的值是否相等(即内容是否一样), 如果用==比较的是内存地址是否一样 。
    十六、 
        1. 什么是方法?
            方法是定义在类中具有某种特定功能的代码块。
        2.方法由什么组成?
            访问修饰符 返回值的类型 方法名(参数)
       (1)访问修饰符:代表该方法所具备的访问权限
       (2)返回值类型:方法运行后结果的类型
       (3)返回值:功能完成之后反馈给调用者的数据(方法运算后的结果, 将结果返回给调用者, 通过关键字 return 返回)
       (4)参数:完成功能时需要调用者提供的数据, 参数分为形参和实参。 (形式参数:定义方法时的参数叫形参, 是一个变量,可有可无, 根据需求来确定需要不需要; 调用方法的时候传入的参数叫实参。 )
       (5)方法名不能以数字开头, 不能是关键字, 首字母小写,驼峰式命名法。
    注意:
        1)在方法的定义中, 方法的返回类型与 return 后面的常量或者变量类型要保持一致; 若方法返回类型为空(void), return 可以省略不写(return,表示返回到方法的调用端)。
        2)在方法调用时, 给方法传递的参数需要与方法定义时的参数保持一致(参数个数一致、 参数类型一致)。
        3)方法只能调用方法, 不可以在方法中定义方法, 方法只能定义在类中。
        4)定义方法时的参数都是形参, 调用方法时的参数都是实参。
        5)每个方法只干一件事, 否则方法的复用性会降低。
        6)同一个类中的静态方法, 可以通过类名.方法名调用, 也可以直接方法名调用; 不同类中的静态方法, 通过类名.方法名来调用。
    十七、 方法的分类
        1.根据返回值是否为空, 有没有参数, 分为:
            1)无参-返回值为空
            2)无参-返回值不为空
            3)有参-返回值为空
            4)有参-返回值不为空

        2.系统已经封装好的方法和自定义的方法
    十八、 变量的作用域和周期
        1、 能同时声明两个相同变量名的变量吗? 为什么?
            可以, 只要两个变量的作用域不冲突就可以。
    展开全文
  • 1.为什么需要变量  内存就像储物柜,用来存放各种东西或数据, ...这就要根据内存地址来找我们需要的数据,计算机的内存地址时16进制的,很长的一串字符,那我们能不能用其他的字符来代替这个地址呢?这个字符就是...

    1.为什么需要变量

      内存就像储物柜,用来存放各种东西或数据, 对程序员来书,数据存入内存只是第一步,还要考虑,怎样找到存入的数据,存入的数据能否修改;写程序就是在做内存存取,先把数据存入内存,需要的是很好拿出来。数据放到内存中,我们怎么找到它呢?这就要根据内存地址来找我们需要的数据,计算机的内存地址时16进制的,很长的一串字符,那我们能不能用其他的字符来代替这个地址呢?这个字符就是变量。

    2.变量的声明和使用

      第一步:声明一个变量以分配空间(根据类型开辟空间)

      第二部:为变量赋值(将数据存入空间)

      第三步:使用变量(取出数据、使用)

    3。变量命名规则

      变量名=首字符+其余部分

      首字符:字母、下划线、$

      其余部分:数字、字母、下划线、$

        应避开关键字

      符合驼峰命名法

      若名字由多个单词组成,从第二个单词开始,首字母均大写

    4.java数据类型

    1,。基本数据类型:分为布尔类型(值为true或false)、数值类型

         数值类型:分为整数类型、浮点类型

         整数类型:byte(1字节(8位))、short(2字节(16位)、int(4字节(32位))、long(8字节(64位))、char(2字节(16位))

         浮点类型:单精度float(4字节(32位))、双精度double(8字节(64位))

    java对于整数有三种不同的表现形式

      十进制:0-9,满10进一

      八进制:0-7,满8进一,以0开头。

      十六进制:0-9,A-F,满16进一,以0X开头

    进制的基本转换

      十进制转二进制:除2取余数

      二进制转十进制:乘2的幂数

      八进制、二进制互转:一位变三位、三位变一位

      十六进制、二进制互转:一位变四位,四位变一位

    负数的二进制表现形式

      对应的正数二进制取反加一

    基本类型转换

      语法

        自动类型转换

          在满足以下条件时,系统自动完成类型转换也称隐含转换

            1.两种类型兼容

            2.目标类型大于源类型

            3.对于表达式,如果操作数为double型,则整个表达式提升为double型

        强制类型转换

          在一定条件下,程序员手动完成类型转换

            1.两种类型兼容

            2.一般目标类型小于源类型

    要点:强制类型转换会丢失精度!

    转载于:https://www.cnblogs.com/zhengfangqing/p/7366802.html

    展开全文
  • 怎样做指针的主人

    2020-05-17 22:54:33
    做指针的主人什么是指针为什么要学习指针如何声明一个指针...C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址。CPU 通过内存寻址对存储在内存中的某个指定数据对象的地


    应学院要求,写了一篇指针的学习心得,顺便也写成博客发了吧…
    以下内容可能比较水,如果有错误,请与我联系,并对此修改。

    什么是指针

    先来说说我的理解,我把整个程序想象成一个豪宅,每个变量是这座豪宅的每个房间,而指针就是这么多房间中其中一个房间的门牌号。接下来是官方的定义
    C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址。CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位。这里,数据对象是指存储在内存中的一个指定数据类型的数值或字符串,它们都有一个自己的地址,而指针便是保存这个地址的变量。也就是说:指针是一种保存变量地址的变量。如下图所示:
    在这里插入图片描述
    左侧连续的十六进制编号就是内存地址,每个内存地址对应一个字节的内存空间。而指针变量保存的就是这个编号,也即内存地址。

    为什么要学习指针

    在C语言中,指针的使用非常广泛,因为使用指针往往可以生成更高效、更紧凑的代码。总的来说,使用指针有如下好处:
    1)指针的使用使得不同区域的代码可以轻易的共享内存数据,这样可以使程序更为快速高效;
    2)C语言中一些复杂的数据结构往往需要使用指针来构建,如链表、二叉树等;
    3)C语言是传值调用,而有些操作传值调用是无法完成的,如通过被调函数修改调用函数的对象,但是这种操作可以由指针来完成,而且并不违背传值调用。

    如何声明一个指针

    指针的声明比普通变量的声明多了一个一元运算符“”,而“”是间接寻址或者间接引用运算符。如下图,p是一个指针,保存着一个地址,该地址指向内存中的一个变量,*p则会访问这个地址所指向的变量。

    int *p;        // 声明一个 int 类型的指针 p
    char *p        // 声明一个 char 类型的指针 p
    int *arr[10]   // 声明一个指针数组,该数组有10个元素,其中每个元素都是一个指向 int 类型对象的指针
    int (*arr)[10] // 声明一个数组指针,该指针指向一个 int 类型的一维数组
    int **p;       // 声明一个指针 p ,该指针指向一个 int 类型的指针
    

    注意指针数组和数组指针的区别

    初始化指针

    声明一个指针变量并不会自动分配任何内存,在对指针间接访问之前,指针必须要初始化,如下图所示:

    /* 方法1:使指针指向现有的内存 */
    int x = 1;
    int *p = &x;  // 指针 p 被初始化,指向变量 x ,其中取地址符 & 用于产生操作数内存地址
    
    /* 方法2:动态分配内存给指针 */
    int *p;
    p = (int *)malloc(sizeof(int) * 10);    // malloc 函数用于动态分配内存
    free(p);    // free 函数用于释放一块已经分配的内存,常与 malloc 函数一起使用,要使用这两个函数需要头文件 stdlib.h
    

    未初始化指针的后果:如果一个指针没有被初始化,那么程序不知道它会指向哪里,可能指向一个非法地址,这样会报错,“运气好的话”,会指向一个合法地址,或许程序会正常运行,但是这个指针所指向的地址的变量的值会被恶意修改,到时候电脑可能就……

    NULL指针

    NULL 指针是一个特殊的指针变量,本身是宏定义的,其本质上就是0,表示不指向任何内存的空指针。但是NULL在C和C++里的用法又是不一样的,就不多细说了。可参考这篇C/C++中对NULL的理解与总结

    指针的用法

    在这里就简略描述一下:指针的运算、指针与数组、指针与结构、指针与函数等…可参考:c语言常见的几种指针用法

    总结

    指针在计算机里充当着一个很重要的角色,我们要了解它,要弄懂它,我们要做豪宅的主人,不要做豪宅的客人!

    参考:
    https://blog.csdn.net/soonfly/article/details/51131141
    https://www.cnblogs.com/lulipro/p/7460206.html
    https://www.cnblogs.com/tongye/p/9650573.html

    展开全文
  • 而在平时我们用到内存地址时,总是用一个8位的16进制数来表示它。 二进制和十六进制又是怎样一回事呢?  简单说来,二进制数就是一种只有0和1两个数码,每满2则进一位的计数进位法。同样,16进制就是每满十六...
  • 3.5.4 字符数据内存中的存储形式及使用方法 41 3.5.5 字符串常量 41 3.5.6 符号常量 42 3.6 变量赋初值 42 3.7 各类数值型数据之间的混合运算 43 3.8 算术运算符和算术表达式 44 3.8.1 C运算符简介 44 3.8.2 算术...
  • 数据结构 1800题》

    热门讨论 2012-12-27 16:52:03
    (1)在数据结构课程中,数据的逻辑结构,数据的存储结构及数据的运算之间存在着怎样的关系? (2)若逻辑结构相同但存储结构不同,则为不同的数据结构。这样的说法对吗?举例说明之。 (3)在给定的逻辑结构及其...
  • 3.5.4 字符数据内存中的存储形式及使用方法 41 3.5.5 字符串常量 41 3.5.6 符号常量 42 3.6 变量赋初值 42 3.7 各类数值型数据之间的混合运算 43 3.8 算术运算符和算术表达式 44 3.8.1 C运算符简介 44 3.8.2 算术...
  • 130_指针10_通过指针为什么可以使被调函数修改主调函数多个变量的值 129_指针9_复习前面所有指针知识 实参和形参永远是不同的变量 128_指针8_星号的三种含义 127_指针7_经典指针程序_互换两个数字_2 127_指针7_经典...
  • 自己的讲解的课程选择了数据结构和算法。这个系列的讲解分为上下两章</code>,<code>javascript语言辅助。本篇文章为上章,涉及的内容是基本的数据结构。在日本,晚上没事安排@…@,...
  • 「5」变量

    2017-05-07 20:21:00
    1、为什么需要变量  ●内存就像储物柜,用来存放各种类型东西(数据) ... ●内存地址不好记,怎么办?  ●为特定地址的内存起个别名,通过别名找到存储的数据  ●该别名就是变量名  ●...
  • 王爽汇编语言程序设计总结

    千次阅读 2014-10-26 22:42:31
    3、怎样根据位地址判断字节地址? 4 4、查看cpu和内存,用机器指令和汇编指令编程。 4 5、段寄存器的使用规范与数据使用规范: 7 6、 cpu提供的栈机制: 7 7、 段的综述: 8 8、 DEBUG的命令T在执行修改...
  • 3.3 当要排序的数据集因太大而无法全部装入内存时,应怎样排序? 3.4 哪一种查找方法最方便? 3.5 哪一种查找方法最快? 3.6 什么是哈希查找? 3.7 怎样对链表进行排序? 3.8 怎样查找链表中的数据? 第4章...
  • C语言编程要点

    2017-09-18 00:10:37
    4.15. 怎样防止其它程序修改你正在修改的那部分文件内容? 71 4.16. 怎样一次打开20个以上的文件? 72 4.17. 怎样避开"Abort,Retry,Fail”消息? 72 4.18. 怎样读写以逗号分界的本? 74 第5章 编译预处理 76 5.1. 什么...
  • uvccapture

    2020-05-08 01:30:31
    process_image 函数只有一个参数,就是存储视频帧的内存地址指针,但是在真正的应用中,通常还需要知道该指针指向的数据的大小。 因此可以修改函数,改成 void process_image ( const void * p, int len ) ,...
  • o 3.9 怎样从/向数据文件读/写结构? o 3.10 我的编译器在结构中留下了空洞, 这导致空间浪费而且无法与外部数据文件进行 "二进制" 读写。能否关掉填充, 或者控制结构域的对齐方式? o 3.11 为什么 sizeof 返回的值...
  • 微机学习要求答案

    2018-11-27 19:19:38
    (2)一个存放在8086计算机系统内存中的数据,它以DS作为段基址寄存器且设(DS)=1000H,段内偏移地址为2300H,会计算该数据的物理地址(同样是:段基地址左移4位+段内偏移地址),指向这一物理地址的DS值和段内偏移...
  • 2.12 怎样从/向数据文件读/写结构? 27 结构填充 27 2.13 为什么我的编译器在结构中留下了空洞?这导致空间浪费而且无法与外部数据文件进行“二进制”读写。能否关掉填充,或者控制结构域的对齐方式? 27  ...
  • 《你必须知道的495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    2.12 怎样从/向数据文件读/写结构? 27 结构填充 27 2.13 为什么我的编译器在结构中留下了空洞?这导致空间浪费而且无法与外部数据文件进行“二进制”读写。能否关掉填充,或者控制结构域的对齐方式? 27  ...
  • 你必须知道的495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    2.12 怎样从/向数据文件读/写结构? 结构填充 2.13 为什么我的编译器在结构中留下了空洞?这导致空间浪费而且无法与外部数据文件进行“二进制”读写。能否关掉填充,或者控制结构域的对齐方式? 2.14 为什么...
  • SDL解析——SDL视频处理(2)

    千次阅读 2010-09-10 13:25:00
    怎样向SDL_SetVideoMode... 但是,pixels成员其实就是一段内存而已,虽然它代表了抽象缓冲区,但是在pixels中的数据没有真正的更新到设备之前,这个新修改的像素点是不会被显示的。于是,我们还需要这样一个函数:vo
  • 微机课程设计

    2004-10-15 18:43:28
    I/O端口地址的编址方式:内存地址空间和I/O端口地址空间统一编址,内存地址空间和I/O端口地址空间独立编址,8086采用后者 CPU与外设间的数据传送方式:程序方式(无条件传送方式,条件传送方式),中断方式,DMA...
  • 一致的数据访问技术ADO与OLE DB的原理以及它们的关系是怎样的 如何在程序中动态得到字段的数据类型 如何手动注册数据源 如何在程序中实现数据源的注册 在Visual C++ 6.0中如何利用UDL文件来建立ADO连接 如何通过ADO...
  • 实例261 利用数据控件录入和修改数据 339 实例262 利用数据集组件实现临时表的存储功能 341 实例263 制作简单的数据库操作软件 342 8.3 图片、多媒体数据录入技术 343 实例264 向access数据库录入图片...
  • 实例261 利用数据控件录入和修改数据 339 实例262 利用数据集组件实现临时表的存储功能 341 实例263 制作简单的数据库操作软件 342 8.3 图片、多媒体数据录入技术 343 实例264 向access数据库...

空空如也

空空如也

1 2 3 4 5 6
收藏数 110
精华内容 44
关键字:

怎样修改内存地址数据