第9章指针实验1Word下载.docx
《第9章指针实验1Word下载.docx》由会员分享,可在线阅读,更多相关《第9章指针实验1Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
pi=&
pj=pi;
3.1画出变量i、pi和pj的形象状态图。
3.2对于变量i所标识的存储单元,现在有几种使用途径?
3.3分析下面语句的输出并编程验证。
*pj=i+*pi;
%d,%d,%d\n"
i,*pi,*pj);
4.分析并比较下面三个程序的输出。
4.1
#include<
stdio.h>
voidmain()
{
inti=3,j=2;
int*pi,*pj,*ptemp;
pj=&
j;
%d,%d\n"
i,j);
*pi,*pj);
ptemp=pi;
pi=pj;
pj=ptemp;
}
4.2
inti=3,j=2,temp;
int*pi,*pj;
temp=*pi;
*pi=*pj;
*pj=temp;
4.3
temp=i;
i=j;
j=temp;
5.有int*pi;
,如何评价语句pi=&
pi;
?
实验9-2空指针
进一步理解指针变量的作用。
1.分析讨论下面程序的说法。
使用指针变量有两个步骤。
第一步:
通过赋值(初始化)操作使指针变量指向某存储单元。
(如inti,*pi=&
或pi=&
或pi=pj;
等)
第二步:
通过间接引用操作符使用指针变量指向的存储单元。
(如printf("
%d"
*pi);
或*pi=5;
2.指出并改正下面程序中的错误。
floatf=2.3,*pf;
*pf=*pf**pf;
%f,%d\n"
f,*pf);
3.分析下面的程序。
3.1
#include<
int*pi;
pi=5;
3.2
pi=0;
3.3
inti;
scanf("
i);
if(i>
NULL)
printf("
%d是正数!
\n"
i);
else
%d是非正数!
分析:
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程序如下:
intadd(intx,inty)
intz;
z=x+y;
returnz;
voidmain()
inta=23,b=-5;
intc;
c=add(a,b);
%d+%d=%d\n"
a,b,c);
如图1所示,C语言中函数调用最重要的特点是传值调用。
图1函数的传值调用
1.2程序如下:
intadd(int*x,int*y)
z=*x+*y;
c=add(&
a,&
b);
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.分析下面的程序。
voidchange(float*pf)
*pf=5.23;
floatfa=2.3;
%f\n"
fa);
change(&
fa);
change函数为何可以改变main函数中局部变量fa的值?
3.根据指针做参数的特点,改写add函数使其返回值为void,其首部为voidadd(intx,inty,int*pSum)。
1)改写后的函数如何使用?
2)与实验7-5中的add函数相比有何差异?
3)C语言中所有的函数都可以没有返回值吗?
4.scanf函数为何可以改变“实参”的值?
4.1当用户输入23回车时,下面的程序有何输出?
inti,*pi=&
pi);
i,*pi);
4.2分析下面的程序。
charbuffer[100]="
23\n"
;
voidscanInt(int*p)
intvalue=0;
inti=0;
while(buffer[i]!
='
\n'
{
value=value*10+(buffer[i]-'
0'
);
++i;
}
*p=value;
scanInt(&
%d\n"
实验9-4函数的返回值为指针变量
进一步理解野指针。
1.分析下面的程序(例9-9)。
int*test()
inti=5,*pi=&
returnpi;
voidtest2()
intj=3;
int*pj;
pj=test();
test2();
*pj);
程序的输出结果为3,不是5,为什么?
2.比较下面两个程序。
2.1
voidtest(int*pi)
*pi=5;
int*p;
test(p);
程序中其它功能……\n"
2.2
if(pi==NULL)
错误!
实参为空指针!
return;
int*p=NULL;
1)两个程序中有语法错误吗?
第一个程序会出现错误,非法访问!
第二个*pi=5有语法错误。
2)两个程序运行结果相同吗?
第一个出现非法访问
第二个是:
注意:
在函数中检测指针参数是否为空指针会提高代码的健壮性。
负责的程序员必须保证指针变量指向合法的地址。
实验9-5指针变量的运算
理解指针变量运算的特点。
1.分析程序指出数组元素在内存中的存放特点。
1.1
inta[3]={1,2,3};
for(i=0;
i<
3;
++i)
%x\t"
a[i]);
1.2
charch[6]="
China"
6;
ch[i]);
1.3
intb[2][3]={1,2,3,4,5,6};
inti,j;
2;
for(j=0;
j<
++j)
printf("
b[i][j]);
2.分析下面的程序,并根据输出结果分析指针变量运算的特点。
inti,*p;
p=&
a[0];
++i,++p)
a[%d]:
%x,%d\n"
i,&
a[i],a[i]);
i,p,*p);
2.2参照2.1编程使用指针变量输出1.2中数组的元素。
2.3参照2.1编程使用指针变量输出1.3中数组的元素。
3.指针变量p的内容为0x0012ff00,求出表达式p+1的值和类型。
4.分析程序。
int*pa,*p;
pa=&
for(p=pa;
p<
=&
a[2];
++p)
%d\t"
p-pa,*p);
1)写出程序的输出,并说明程序的执行过程。
2)利用指针,编程从右至左输出数组元素即依次输出a[2],a[1],a[0]。
p>
--p)
pa-&
a[0],*p);