实验报告
源程序:
#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 内部数据格式无法自动转换成整数数据。
如果有错误请大佬们指出,新手学习中……