zoukankan      html  css  js  c++  java
  • 实验报告:指针与地址

    实验报告

    源程序:

    #include<iostream>
    using namespace std;
    void main()
    {
        int i1=10,i2 = 20, *pi;
        double d1 = 100, d2 = 200, *pd;
        char c1 = 'A', c2 = 'B', *pc;
        long l1 = 1000, l2 = 2000, *pl;
        /*显示整型变量的地址及值*/
        pi = &i2;
        cout << "&i1=" << &i1 << ",&i2=" << &i2 << endl;
        cout << "&pi=" << &pi << ",pi=" << pi << ",*pi=" << *pi << endl;
        pi++;                                                            //指向变量i1;
        cout << "&pi=" << &pi << ",pi=" << pi << ",*pi=" << *pi << endl;
        cout << endl << endl;
        /*显示双精度实型变量的地址及值 */
        pd = &d2;
        cout << "&d1=" << &d1 << ",&d2=" << &d2 << endl;
        cout << "&pd=" << &pd << ",pd=" << pd << ",*pd=" << *pd << endl;
        pd++;
        cout << "&pd=" << &pd << ",pd=" << pd << ",*pd=" << *pd << endl;
        cout << endl << endl;
        /*显示字符型变量的地址及值 */
        pc = &c2;
        cout << "&c1=" << static_cast<const void*>(&c1);    //输出c1的地址
        cout << ",&c2=" << static_cast<const void*>(&c2) << endl;
        cout << "&pc=" << &pc;
        cout << ",pc=" << static_cast<const void*>(pc) << ",*pc=" << *pc << endl;
        pc++;                                                //注意此时没有指向c1  <--左边文字为 书上的注释 ,但是这里确实指向了c1 
        cout << "&pc=" << &pc;
        cout << ",pc=" << static_cast<const void*>(pc) << ",*pc=" << *pc << endl;
        cout << endl << endl;
        /*显示整型变量的地址及值*/
        pl = &l2;
        cout << "&l1=" << &l1 << ",&l2=" << &l2 << endl;
        cout << "&pl=" << &pl << ",pl=" << pl << ",*pl=" << *pl << endl;
        pl++;                                                            //指向变量i1;
        cout << "&pl=" << &pl << ",pl=" << pl << ",*pl=" << *pl << endl;
        cout << endl << endl;
        int m1 = 100;
        short int*psm;
        psm = (short int*)&m1;
        cout << *psm;
        cout << endl;
        //范围为 短整型的范围:-2^15 ~ 2^15-1
    }

     

    二、实验要求

           (1)仿照题目增加long型数据的测试,并对已有的结果进行分析

    程序结果:

     

    &i1=010FF9A0,&i2=010FF998
    &pi=010FF988,pi=010FF998,*pi=20
    &pi=010FF988,pi=010FF99C,*pi=2000
    
    
    &d1=010FF9B0,&d2=010FF9A8
    &pd=010FF98C,pd=010FF9A8,*pd=200
    &pd=010FF98C,pd=010FF9B0,*pd=100
    
    
    &c1=010FF997,&c2=010FF996
    &pc=010FF984,pc=010FF996,*pc=B
    &pc=010FF984,pc=010FF997,*pc=A
    
    
    &l1=010FF9A4,&l2=010FF99C
    &pl=010FF990,pl=010FF99C,*pl=2000
    &pl=010FF990,pl=010FF9A0,*pl=10
    
    
    100
    请按任意键继续. . .

    (2)对指针变量采用强制类型转换时,对于以下的代码:(源程序在上面)

    Int i1=100;short int * psi;psi =(short int *)&i1;cout<<*psi;

    程序运行后,可以输出正确结果100,试分析当i1的取值范围在什么情况下这个结论是成立的

    结果:

     同上

    分析:(1)由于长整型占字节数为4字节,因此地址自增后增加了4,从F79C—>F7A0

    与i1地址相同,故*pl的值与i1的值相等,为10;同理,整型占字节数也为4字节,地址自增增加4,从F998-->F99C和&l2的地址相同,故*pi的值与l2的相等,为2000.字符型为占一个字节,自增后从F996àF997,其值由’B’-->’A’;

    (2)(short int*)&i1;(在图中是m1)整型i1的值强制转换为短整型,由于短整型占两个字节,为16位(16位什么,我忘记了。。),其范围为 -2^15 ~ (2^15-1),在这个范围内能够输出正确结果。

     

     算法思想:

    上述结果中地址的前四位表示段地址,因不同机器而异,主要比较分析后4位。整型变量i1和i2的地址之差为4,双精度实型变量d1和d2的地址只差为8,字符型变量c1和c2的地址之差为1,(因编译环境不同而异)。注意自增后地址的变化,长整型占4个字节,短整型2个字节(在C++),字符型占一个字节,双精度实型占8个字节。

     

     

    结论(易错分析):

    <1>对于字符串(字符数组)或字符型变量输出地址时,如果直接输出,会输出字符串或者乱码,需要使用 static_case<const void*>对字符地址进行强制类型转换。

    <2>对指针变量采用强制类型转换时,可能输出不正确的结果。运行以下代码:

    float f1=10;int *pi;pi=(int *)&f1;cout<<*pi;

    不能正确输出结果10,因为float 内部数据格式无法自动转换成整数数据。

    如果有错误请大佬们指出,新手学习中……

    那片天空,我即向往,在雷雨云风中,独自翱翔。
  • 相关阅读:
    API连接显示
    zabbix基本介绍
    JMX类型监控
    zabbix sender
    监控项的获取
    zabbix值显示的问题
    windows客户端
    gj的zabbix客户端开机自启动设置
    TCP/UDP
    内置宏
  • 原文地址:https://www.cnblogs.com/nanxi-zwj/p/6110893.html
Copyright © 2011-2022 走看看