c++指针引用和结构体文档格式.docx
- 文档编号:21433546
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:18
- 大小:251.75KB
c++指针引用和结构体文档格式.docx
《c++指针引用和结构体文档格式.docx》由会员分享,可在线阅读,更多相关《c++指针引用和结构体文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
//B
p1="
p1<
p2="
p2<
p2-p1="
p2-p1<
*p2-*p1="
*p2-*p1<
//C
}
⑵上机要求
将程序中A行改为“p1=&
a[0]”观察程序运行结果。
将程序中B行改为“cout<
*a="
*a<
”观察程序运行结果。
将程序中C行改为“cout<
a[5]-a[0]="
a[5]-a[0]<
(3)对以上结果写出实验分析:
a[0]”,结果不变,因为“a”和“&
a[0]”都表示数组的首地址。
”a是a[0]的地址,*a是元素a[0]的值,即为0。
”因为a[0]和*p1等价,a[5]和*p2等价,故结果不变。
⒉上机实验题二
指出下列程序的错误。
#include<
voidexchange(int,int);
Inputtwodatasepratedbyspace:
;
inta,b;
cin>
>
a>
b;
BeforeExchange:
b="
b<
exchange(a,b);
AfterExchange:
voidexchange(intx,inty)
intt;
t=x;
x=y;
y=t;
本例的目的是在子函数中交换的两个变量的值,在主函数中使用。
但函数的数据传值调用方式是将实参的数据值传递给形参,实参和形参在内存中占用不同的地址单元,改变形参值不改变实参值。
要想通过改变形参的值而改变实参的值,则应使用指针调用或引用调用。
而且引用调用大有取代指针调用之势。
使用指针调用如下:
voidexchange(int*,int*);
inta,b,*p1=&
a,*p2=&
exchange(p1,p2);
voidexchange(int*x,int*y)
t=*x;
*x=*y;
*y=t;
使用引用调用如下(待讲完引用再做):
voidexchange(int&
int&
);
voidexchange(int&
x,int&
y)
分别输出三个程序中形参和输出变量的地址。
(3)写出实验分析及结果
第一种方法的形参,实参的地址不同,交换的只是指针的指向,故不能实现实参的交换。
第二种地址相同,交换的是实参的值。
第三种是引用调用,交换的也是实参的值。
⒊上机实验题三
自定义函数实现字符串的拷贝。
字符串不允许进行赋值运算,只能使用头文件string.h中定义的strcpy()库函数。
本例要求自己编制一个自定义函数实现strcpy()库函数的功能。
char*mycopy(char*,constchar*);
chars1[]="
Iamastudent"
chars2[20];
mycopy(s2,s1);
s1="
s1<
s2="
s2<
char*mycopy(char*to,constchar*from)
char*temp=to;
for(;
*to++=*from++;
returntemp;
将自定义函数改为下列程序段:
for(inti=0;
*(from+i)!
='
\0'
i++)
*(to+i)=*(from+i);
*(to+i)='
观察现象。
实现了字符串的拷贝。
将自定义函数的声明改为:
“char*mycopy(constchar*,constchar*);
”
自定义函数相应改为:
char*mycopy(constchar*to,constchar*from)
出错
D:
\课程\lab1_1\lab1_1.cpp(13):
errorC2440:
'
initializing'
:
cannotconvertfrom'
constchar*'
to'
char*'
\课程\lab1_1\lab1_1.cpp(14):
errorC2166:
l-valuespecifiesconstobject
在自定义函数中能否使用如下的语句“*from='
a'
不能。
‘a’是字符,*from是指针局部变量,不能把字符常量赋给指针,只能把地址或数组名、指针赋给指针变量。
1、形参,实参类型应保持一致。
2、常量在自定义函数中最好不变,而是赋给一个新定义变量,再改变变量的值。
3、自定义函数结束,记得返回变量的值,而不是常量的值。
⒋上机实验题四
使用函数的指针分别调用两个函数sum1和sum2分别求不大于该数的偶数或奇数之和。
使用函数的指针,可以通过指针的赋值分别调用不同的函数。
intsum1(int);
intsum2(int);
inta;
int(*f)(int);
//A指针函数
Inputadata:
a;
if(a%2==0)
{
f=sum1;
(*f)(a)<
else
f=sum2;
intsum1(intm)
ints1=0;
for(inti=2;
=m;
i=i+2)
s1=s1+i;
returns1;
intsum2(intn)
ints2=0;
for(inti=1;
=n;
s2=s2+i;
returns2;
将A行改为“int(*f)(int);
”,观察现象。
未变化。
分别输出两个函数的函数名,观察其地址值。
地址相差5字节。
自定义函数的内存空间大致在4~5个字节。
⒌上机实验题五
编写一个程序判定一个字符在一个字符串中出现的次数,如果该字符不出现则返回0。
给出源代码及运行结果。
int
freq(char
s[],char
ch)
char
*p=s;
count=0;
while(*p!
)
if
(*p==ch)
count++;
p++;
return
count;
void
main()
s[100],ch;
cout<
”请输入字符串:
”;
cin>
s;
”请输入字符:
ch;
ch<
”出现的次数:
”<
freq(s,ch);
printf("
%c出现次数:
%d\n"
ch,freq(s,ch));
第二部分自测练习
1.自测练习一
使用new和delete创建动态堆栈。
new和delete运算符可以对数组和结构体进行动态内存分配和释放。
一个完整的应用程序如下:
structStack{
intstacksize;
long*buffer;
long*sp;
}p;
voidini(intsize)
p.stacksize=size;
p.sp=p.buffer=newlong[size];
voiddel()
deletep.buffer;
voidpush(longdata)
if(p.sp>
=p.buffer+p.stacksize)
cerr<
stackoverflow!
\n"
else
{*p.sp++=data;
data<
ispushed."
}
longpop()
if(p.sp<
=p.buffer){
cerr<
stackisempty!
return0;
}
return*--p.sp;
ini(5);
//A
push(1234);
push(5678);
push(1357);
push(2468);
pop()<
ispoped"
del();
}
⑵上机要求
将程序中A行分别改为“ini
(2);
”和“ini(8);
2.自测练习二
编写程序建立一个学生学习成绩的链表,完成链表的输出、插入、删除操作。
在程序中,经常用到数量不确定的相同结构类型的数据处理,用数组往往造成存储空间的浪费,链表可以通过数据的动态存储克服这一缺点。
structStudent//创建结构
longnumber;
floatscore;
Student*next;
};
Student*head;
Student*Create()//建立链表
Student*ps;
Student*pend;
ps=newStudent;
head=NULL;
pend=ps;
Inputnumberandscore:
ps->
number>
score;
while(ps->
number!
=0){
if(head==NULL)
head=ps;
pend->
next=ps;
pend=ps;
ps=newStudent;
cin>
pend->
next=NULL;
deleteps;
return(head);
voidshowlist(Student*head)//输出链表
nowtheitemsoflistare\n"
while(head){
head->
number<
"
score<
head=head->
next;
voidInsert(Student*head,Student*stud)//插入链表节点
if(head==NULL){
head=stud;
stud->
return;
Student*pGuard=head->
head->
next=stud;
stud->
next=pGuard;
return;
voidDelete(longnumber)//删除链表节点
{
Student*p;
if(head->
number==number){
p=head;
head=head->
deletep;
theheadoflisthasbeendeleted\n"
for(Student*pGuard=head;
pGuard->
next!
=NULL;
pGuard=pGuard->
next){
if((pGuard->
next)->
p=pGuard->
pGuard->
next=p->
deletep;
cout<
hasbeendeleted\n"
return;
cout<
isnotfoud!
voidmain()//主函数
Student*ts;
head=Create();
showlist(head);
Studentps,xs;
ts=head;
Inputinsertnumberandscore:
ps.number>
ps.score;
while(ts){
if(ps.number==ts->
number){
该学号已存在,请重新输入"
cin>
ts=head;
ts=ts->
Insert(head,&
ps);
Inputdeletenumber:
xs.number;
Delete(xs.number);
按以下格式输入数据,观察程序运行结果。
Inputnumberandscore:
111
222
333
000
Inputinsrtnumberandscore:
444
Inputdeletenumber:
2
将主函数中的“xs.number”改写为“ps.number”观察现象,分析原因。
删除voidDelete(longnumber)函数中的“deletep;
”语句,观察现象。
实验结果未发生变化。
修改程序实现对输出结果按学号从大到小的顺序排序。
(3)写出实验分析及结果。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c+ 指针 引用 结构