实验报告:指针与地址

实验报告

源程序:

#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对字符地址进行强制类型转换。

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

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

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

如果有错误请大佬们指出,新手学习中……
原文链接: https://www.cnblogs.com/nanxi-zwj/p/6110893.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/244763

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月14日 上午12:22
下一篇 2023年2月14日 上午12:22

相关推荐