c++指针引用和结构体文档格式.docx

上传人:b****5 文档编号:21433546 上传时间:2023-01-30 格式:DOCX 页数:18 大小:251.75KB
下载 相关 举报
c++指针引用和结构体文档格式.docx_第1页
第1页 / 共18页
c++指针引用和结构体文档格式.docx_第2页
第2页 / 共18页
c++指针引用和结构体文档格式.docx_第3页
第3页 / 共18页
c++指针引用和结构体文档格式.docx_第4页
第4页 / 共18页
c++指针引用和结构体文档格式.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

c++指针引用和结构体文档格式.docx

《c++指针引用和结构体文档格式.docx》由会员分享,可在线阅读,更多相关《c++指针引用和结构体文档格式.docx(18页珍藏版)》请在冰豆网上搜索。

c++指针引用和结构体文档格式.docx

//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)写出实验分析及结果。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1