第9章指针实验1.docx
- 文档编号:3741011
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:16
- 大小:126.82KB
第9章指针实验1.docx
《第9章指针实验1.docx》由会员分享,可在线阅读,更多相关《第9章指针实验1.docx(16页珍藏版)》请在冰豆网上搜索。
第9章指针实验1
第9章指针
实验9-1指针类型
实验目的:
理解指针类型。
实验步骤:
1.分组讨论下面的说法或问题。
1.1指针变量存储的内容为地址,而地址是有类型的,因为地址必须是某存储单元的地址时才有意义(即可以通过地址根据类型使用相关存储单元),因此,指针变量本质上指向的是某类型的存储单元。
1.2有了指针变量就是又多了一种使用存储单元的途径。
1.3地址是编号是整数,为何不能用整数给指针变量赋值?
但为何使用强制类型转换之后就可以了?
编译系统为何只尽到提醒的义务,而不绝对禁止呢?
(内存问题)
2.已知有inti=3,*pi=&i;
2.1分析下面语句的输出(不能确定时用某某变量的地址代替)并编程验证。
printf("%x,%x,%x\n",&i,i,*i);
printf("%x,%x,%x\n",&pi,pi,*pi);
2.2根据程序的输出,画出变量i和pi简化的存储状态图。
2.3分析下面语句的输出并编程验证。
printf("%x,%x,%x\n",pi,*&pi,&*p);
3.有inti=3,*pi,*pj;
pi=&i;
pj=pi;
3.1画出变量i、pi和pj的形象状态图。
3.2对于变量i所标识的存储单元,现在有几种使用途径?
3.3分析下面语句的输出并编程验证。
*pj=i+*pi;
printf("%d,%d,%d\n",i,*pi,*pj);
4.分析并比较下面三个程序的输出。
4.1
#include
voidmain()
{
inti=3,j=2;
int*pi,*pj,*ptemp;
pi=&i;
pj=&j;
printf("%d,%d\n",i,j);
printf("%d,%d\n",*pi,*pj);
ptemp=pi;
pi=pj;
pj=ptemp;
printf("%d,%d\n",i,j);
printf("%d,%d\n",*pi,*pj);
}
4.2
#include
voidmain()
{
inti=3,j=2,temp;
int*pi,*pj;
pi=&i;
pj=&j;
printf("%d,%d\n",i,j);
printf("%d,%d\n",*pi,*pj);
temp=*pi;
*pi=*pj;
*pj=temp;
printf("%d,%d\n",i,j);
printf("%d,%d\n",*pi,*pj);
}
4.3
#include
voidmain()
{
inti=3,j=2,temp;
int*pi,*pj;
pi=&i;
pj=&j;
printf("%d,%d\n",i,j);
printf("%d,%d\n",*pi,*pj);
temp=i;
i=j;
j=temp;
printf("%d,%d\n",i,j);
printf("%d,%d\n",*pi,*pj);
}
5.有int*pi;,如何评价语句pi=π?
实验9-2空指针
实验目的:
进一步理解指针变量的作用。
实验步骤:
1.分析讨论下面程序的说法。
使用指针变量有两个步骤。
第一步:
通过赋值(初始化)操作使指针变量指向某存储单元。
(如inti,*pi=&i;或pi=&i;或pi=pj;等)
第二步:
通过间接引用操作符使用指针变量指向的存储单元。
(如printf("%d",*pi);或*pi=5;等)
2.指出并改正下面程序中的错误。
#include
voidmain()
{
floatf=2.3,*pf;
*pf=*pf**pf;
printf("%f,%d\n",f,*pf);
}
3.分析下面的程序。
3.1
#include
voidmain()
{
int*pi;
pi=5;
}
3.2
#include
voidmain()
{
int*pi;
pi=0;
}
3.3
#include
voidmain()
{
inti;
scanf("%d",&i);
if(i>NULL)
printf("%d是正数!
\n",i);
else
printf("%d是非正数!
\n",i);
}
分析:
1)3.1和3.2两个程序有何区别?
2)如何评价程序3.3?
0与NULL相同吗?
通常如何使用?
4.(练习9.13)已知整型指针变量pa,pb,pc分别指向整型变量a,b,c。
按下面要求编程。
4.1使用指针交换a,b,c的值,使变量a,b,c按升序排列。
(指针指向的对象不变,即pa一直指向a。
)
4.2变量a,b,c的值不变,但pa,pb,pc指向的变量按升序排列(即pa指向值最小的变量。
)
实验9-3函数的形参为指针变量
实验目的:
理解地址传递的特点,掌握指针为形参时的用法。
实验步骤:
1.分析求两个整数和的函数。
1.1程序如下:
#include
intadd(intx,inty)
{
intz;
z=x+y;
returnz;
}
voidmain()
{
inta=23,b=-5;
intc;
c=add(a,b);
printf("%d+%d=%d\n",a,b,c);
}
分析:
如图1所示,C语言中函数调用最重要的特点是传值调用。
图1函数的传值调用
1.2程序如下:
#include
intadd(int*x,int*y)
{
intz;
z=*x+*y;
returnz;
}
voidmain()
{
inta=23,b=-5;
intc;
c=add(&a,&b);
printf("%d+%d=%d\n",a,b,c);
}
分析:
1)把程序补充完整。
使用函数调用add(a,b)可以吗?
为什么?
2)使用函数调用add(&a,&b)可以吗?
为什么?
假设此时变量a和b的地址分别为0x0012ff7c和0x0012ff78,把图2补充完整。
图2函数的传值调用
指针变量x的内容为变量a的地址,也就是说指针变量x指向了变量a,使用*x也可以访问变量a所标识的存储单元了。
3)为什么可以在add函数中使用main函数中的变量a?
答:
这个问题有问题!
add函数中不可以使用变量a,在add函数中只是使用了变量a所标识的存储单元!
只要存储单元归程序所有就可以通过指针使用它!
2.分析下面的程序。
#include
voidchange(float*pf)
{
*pf=5.23;
}
voidmain()
{
floatfa=2.3;
printf("%f\n",fa);
change(&fa);
printf("%f\n",fa);
}
分析:
change函数为何可以改变main函数中局部变量fa的值?
3.根据指针做参数的特点,改写add函数使其返回值为void,其首部为voidadd(intx,inty,int*pSum)。
1)改写后的函数如何使用?
2)与实验7-5中的add函数相比有何差异?
3)C语言中所有的函数都可以没有返回值吗?
4.scanf函数为何可以改变“实参”的值?
4.1当用户输入23回车时,下面的程序有何输出?
#include
voidmain()
{
inti,*pi=&i;
scanf("%d",pi);
printf("%d,%d\n",i,*pi);
}
4.2分析下面的程序。
#include
charbuffer[100]="23\n";
voidscanInt(int*p)
{
intvalue=0;
inti=0;
while(buffer[i]!
='\n')
{
value=value*10+(buffer[i]-'0');
++i;
}
*p=value;
}
voidmain()
{
inti;
scanInt(&i);
printf("%d\n",i);
}
实验9-4函数的返回值为指针变量
实验目的:
进一步理解野指针。
实验步骤:
1.分析下面的程序(例9-9)。
#include
int*test()
{
inti=5,*pi=&i;
returnpi;
}
voidtest2()
{
intj=3;
}
voidmain()
{
int*pj;
pj=test();
test2();
printf("%d\n",*pj);
}
分析:
程序的输出结果为3,不是5,为什么?
2.比较下面两个程序。
2.1
#include
voidtest(int*pi)
{
*pi=5;
}
voidmain()
{
int*p;
test(p);
printf("程序中其它功能……\n");
}
2.2
#include
voidtest(int*pi)
{
if(pi==NULL)
{
printf("错误!
实参为空指针!
\n");
return;
}
*pi=5;
}
voidmain()
{
int*p=NULL;
test(p);
printf("程序中其它功能……\n");
}
分析:
1)两个程序中有语法错误吗?
第一个程序会出现错误,非法访问!
第二个*pi=5有语法错误。
2)两个程序运行结果相同吗?
为什么?
第一个出现非法访问
第二个是:
注意:
在函数中检测指针参数是否为空指针会提高代码的健壮性。
负责的程序员必须保证指针变量指向合法的地址。
实验9-5指针变量的运算
实验目的:
理解指针变量运算的特点。
实验步骤:
1.分析程序指出数组元素在内存中的存放特点。
1.1
#include
voidmain()
{
inta[3]={1,2,3};
inti;
for(i=0;i<3;++i)
printf("%x\t",&a[i]);
}
1.2
#include
voidmain()
{
charch[6]="China";
inti;
for(i=0;i<6;++i)
{
printf("%x\t",&ch[i]);
}
}
1.3
#include
voidmain()
{
intb[2][3]={1,2,3,4,5,6};
inti,j;
for(i=0;i<2;++i)
{
for(j=0;j<3;++j)
printf("%x\t",&b[i][j]);
printf("\n");
}
}
2.分析下面的程序,并根据输出结果分析指针变量运算的特点。
2.1
#include
voidmain()
{
inta[3]={1,2,3};
inti,*p;
p=&a[0];
for(i=0;i<3;++i,++p)
{
printf("a[%d]:
%x,%d\n",i,&a[i],a[i]);
printf("a[%d]:
%x,%d\n",i,p,*p);
}
}
2.2参照2.1编程使用指针变量输出1.2中数组的元素。
2.3参照2.1编程使用指针变量输出1.3中数组的元素。
3.指针变量p的内容为0x0012ff00,求出表达式p+1的值和类型。
4.分析程序。
#include
voidmain()
{
inta[3]={1,2,3};
int*pa,*p;
pa=&a[0];
for(p=pa;p<=&a[2];++p)
printf("a[%d]:
%d\t",p-pa,*p);
}
分析:
1)写出程序的输出,并说明程序的执行过程。
2)利用指针,编程从右至左输出数组元素即依次输出a[2],a[1],a[0]。
#include
voidmain()
{
inta[3]={1,2,3};
int*pa,*p;
pa=&a[2];
for(p=pa;p>=&a[0];--p)
printf("a[%d]:
%d\t",pa-&a[0],*p);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第9章 指针实验1 指针 实验