文档库 最新最全的文档下载
当前位置:文档库 › 第8-9 章练习 指针与引用

第8-9 章练习 指针与引用

第8-9 章练习 指针与引用
第8-9 章练习 指针与引用

一、选择题

1、若有以下定义,则说法错误的是( )。

int a=100,*p=&a ;

A .声明变量p ,其中*表示p 是一个指针变量

B .变量p 经初始化,获得变量a 的地址

C .变量p 只可以指向一个整形变量

D .变量p 的值为100

2、若有以下定义,则赋值正确的是( )。

int a ,b , *p;

float c, *q;

A .p=&c

B .q=p

C .p=NULL

D .q=new int

3、如果x 是整型变量,则合法的形式是( )。

A .&(x+5)

B .*x

C .&*x

D .*&x

4、若要建立如下关系,错误的语句组是( )。

A .

B . D .

int *p=&x, x; int x, p=&x; int *p, x=10; int *p, x;

*p=10; *p=10; *p=&x; p=&x ; x=10;

5、若有语句int a[10]={0,1,2,3,4,5,6,7,8,9},*p=a ;则( )不是对a 数组元素的正确引用(其中0≤i <10)。

A .p[i]

B .*(*(a+i))

C .a[p-a]

D .*(&a[i])

6、若有以下定义,则变量p 所占内存空间的字节数是( )。

float *p;

A.1

B.2

C.4

D.8

7、 若有以下定义,则赋值错误的是( )。

int a,*p,*q;

A. *p=&a ;

B.p=new int ;

C.q=NULL;

D.p=q

8、下列程序运行结果是( )。

#include

void main()

{int a=10,*q;

if(q==NULL)

cout<<"####"<

else

q=&a;

cout<<*q<

}

A. ####

B.10

C. 有语法错误

D.*q

9、若程序段static char line[]=”Visual C++”; char *point=line; 则point 的值为( )。

A. ”Visual C++”

B. line 的首地址

C. Visual

D. \0

10、相同数据类型的数组名和指针变量均表示地址,以下不正确的说法是( )。

A. 数组名代表的地址不变,指针变量存放的地址可变。

B. 数组名代表的存储空间不变,指针变量指向的存储空间长度可变。

C. A 和B 的说法均正确。

D. 没有差别。

x

p

11、若有以下定义,则下列操作错误的是()。

int a[5]={1,3,5,7,9},*p=new int [5];

A.p=a;

B.*p=a;

C.*(p+1)=a[1];

D.*p=*a

12、若有以下定义,则释放指针所指内存空间的操作是()。

int *p=new int [10];

A.delete []p;

B.delete *p

C.delete p; delete p[]

13、执行下列程序段后,字符串str1的值是()。

char str1[8] ,str2[]=”AA\0BB”;

strcpy(str1,str2);

A. AA\0BB

B. AA BB

C. AA

D.AA\0BB\0

14、写出下列程序运行结果是( )。

#include

void main()

{

char ch[3][4]={“AAA”,”BB”,”CCC”},(*q)[4]=ch, *p;

// ch是二维数组,q是指向一维数组指针,并且一维数组每行只有4个字符

//q并取得二维数组ch首地址

int i;

p=new char; //申请地址

*p=’b’; //装入字符b

*(*q+3)=*p;

for(i=0;i<3;i++) cout<

}

A.B.C.D.

AAAbBB AAAb AAA AAA

BB BB bBB BB

CCC CCC CCC CCC

答案:A

分析:二维字符数组初始化后值如下表:

0 1 2 3

1

2

1

2

,q[1]输出是BB,q[2]输出CCC,只能选择A。

15、设有如下定义,下面关于ptr正确叙述是( C )。

int (*ptr)();

A.ptr是指向一维数组的指针变量

B.ptr是指向int 型数据的指针变量

C.ptr是指向函数的指针,该函数返回一个int型数据

D.ptr是一个函数名,该函数的返回值是指向int型数据的指针

二、写出下列程序运行结果:

1、#include

void main()

{int *pn, n=10,m=20;

float *pf, px=3.14159,py=2.71828;

pn=&n;

*pn+=m;

cout<<”n 现在的值是:”<<*pn<

pf=&px;

py+=5*(*pf);

cout<<”py现在的值是:”<

}

运行结果是:

n 现在的值是:30

pf 现在的值是:18.4262

分析:指针是通过在变量前加一个“*”来定义,使用用“*”加变量名存取指针所指的值,用运算“&”取变量的地址,但是不能存取无指向的指针所指向内容,这样会导致系统故障。

2、#include

void main()

{int I,*p,a[]={10,20,30,40,50,60};

p=a;

for(I=0;I<5;I++)

cout<<”a[“<

<<’\t’<<”*(p+”<

}

运行结果:

a[0]=10 *(a+0)=10 *(p+0)=10 p[0]=10

a[1]=20 *(a+1)=20 *(p+1)=20 p[1]=20

a[2]=30 *(a+2)=30 *(p+2)=30 p[2]=30

a[3]=40 *(a+3)=40 *(p+3)=40 p[3]=40

a[4]=50 *(a+4)=50 *(p+4)=50 p[4]=50

a[5]=60 *(a+5)=60 *(p+5)=60 p[5]=60

分析:分析程序根据指针与数组关系,引用数据可以有四种不同的表示方法:使用数组下标变量;使用数据固有的指针——数组名间接引用;使用指向数组的指针的间接引用;使用指向数组的指针下标引用。

3、#include

void fun(int *& a, int &m)

{ a=new int[m]; //A

int * p=a;

for(int i=0;i

*p++=i*i+1;

}

void main()

{ int *b,n=5;

fun(b,n);

for(int i=0;i

cout<

cout<

第七次作业(指针)

习题十 一、选择题 10-1.已知:int *p, a;则语句"p=&a;"中的运算符"&"的含义是。 A.位与运算B.逻辑与运算C.取指针内容D.取变量地址 10-2.已知:int a,x;则正确的赋值语句是。 A.a=(a[1]+a[2])/2; B.a*=*a+1; C.a=(x=1,x++,x+2); D.a="good"; 10-3.已知:int a, *p=&a;则下列函数调用中错误的是。 A.scanf("%d", &a); B.scanf("%d", p); C.printf("%d", a); D.printf("%d", p); 10-4.main(argc, argv)中形式参数argv的正确说明形式应当为。 ?? A.char *argv[ ] B.char argv[ ][ ] C.char argv[ ] D.char *argv 10-5.说明语句"int (*p)( );"的含义是。 A.p是一个指向一维数组的指针变量 B.p是指针变量,指向一个整型数据 C.p是一个指向函数的指针,该函数的返回值是一个整型 D.以上都不对 10-6.设有说明int (* ptr)[M];其中的标识符ptr是。 A.M个指向整型变量的指针 B.指向M个整型变量的函数指针 C.一个指向具有M个整型元素的一维数组的指针 D.具有M个指针元素的一维指针数组,每个元素都只能指向整型变量 10-7.已知:double *p[6];它的含义是。 A.p是指向double型变量的指针B.p是double型数组 C.p是指针数组D.p是数组指针 10-8.已知函数说明语句:void *f( );则它的含义是。 A.函数f的返回值是一个通用型的指针 B.函数f的返回值可以是任意的数据类型 C.函数f无返回值 D.指针f指向一个函数,该函数无返回值 10-9.已知:char s[10], *p=s,则在下列语句中,错误的语句是。 A.p=s+5; B.s=p+s; C.s[2]=p[4]; D.*p=s[0]; 10-10.已知:char b[5], *p=b;则正确的赋值语句是。 A.b="abcd"; B.*b="abcd"; C.p="abcd"; D.*p="abcd";

指针数组函数练习(含参考答案).

作业(使用指针、数组、函数完成) 1. 编写一个通用函数,该函数可以实现判断:一个含有五位数字的整数是否是回文数。回文数的含义是从左向右与从右向左看,数是相同的。如:23732是回文数,而23564则不是。编写主程序调用该函数实现求所有5位数字中满足条件的数的个数。 #include int Judge(long num { int m,t,h,s,g; m=num/10000; t=(num-m*10000/1000; h=(num-m*10000-t*1000/100; s=(num-m*10000-t*1000-h*100/10; g=num-m*10000-t*1000-h*100-s*10; if((m==g&&(t==s return 1; else return 0; } void main( { int count=0; long i; for(i=10000;i<=99999;i++ if(Judge(i count++; printf("%d\n",count;

} 2.编写一个通用函数,该函数可以实现对数值型数组的倒序。倒序的含义是把数组的元素值前后颠倒。例数组:20,19,18,15,13,10倒序的结果为:10,13,15,18,19,20。编写主程序,数组初始化方式不限,并输出,然后调用该函数实现倒序后再输出倒序的结果。 #include #define N 6 void Transfer(double *b,int n { double temp; double *i=b; double *j=b+n-1; while(j>i { temp=*i; *i=*j; *j=temp; i++; j--; } } void main( { double array[N]={20,19,18,15,13,10}; int i; for(i=0;i printf("%.0f\t",array[i];

作业2答案

第2次作业 第2章作业: 3、程序计数器(PC)作为不可寻址寄存器有哪些特点?数据指针DPTR有哪些特点?与程序计数器(PC)有何异同? 程序计数器(PC)的特点: (1)PC是中央控制器中最基本的寄存器,是一个独立的计数器,存放着下一条将要从程序存储器中取出的指令地址; (2)PC具有自动加1的功能,这是最基本的工作方式,PC变化的轨迹决定着程序的流程; (3)PC的宽度决定着程序存储器可以直接寻找的范围。 数据指针DPTR的特点: (1)DPTR是一个16位的特殊功能寄存器,主要功能是作为片外数据存储器寻址的地址寄存器(间接地址); (2)DPTR寄存器既可以作为16位寄存器处理,也可以作为两个8位寄存器处理。 异同: (1)两者都是与地址有关的16位寄存器,其中,PC与程序存储器的地址有关;DPTR与数据存储器有关,作为地址寄存器使用时,PC与DPTR都是通过P0和P2口输出的,但是,PC的输出与ALE和PSEN有关,DPTR的输出则与ALE,WR,RD有关; (2)PC只能作为16位寄存器对待,由于有自动加1的功能,故又称计数器。PC是不可访问的,有其独特的变化方式,它的变化轨迹决定了程序执行的流程;DPTR可以作为16位寄存器对峙,也可以作为两个8位寄存器对待,是可以访问的。 4、80C51存储器在结构上有何特点?在物理上和逻辑上各有哪几种地址空间? 80C51存储器采用哈佛结构,即将程序存储器和数据存储器截然分开,程序存储器和数据存储器各有自己的寻址方式、寻址空间和控制系统。这种结构对于单片机“面向控制”的实际应用极为方便、有利。在80C51单片机中,不仅在片内驻留了一定容量的程序存储器和数据存储器及众多的特殊功能寄存器,而且还具有极强的外部存储器扩展能力,寻址范围分别可达64KB,寻址和操作方便简单。 物理地址空间上; (1)内部程序寄存器4KB; (2)外部程序寄存器64KB; (3)内部数据寄存器256B; (4)外部数据寄存器64KB。 逻辑地址空间上: (1)片内片外统一的64KB程序存储器地址空间; (2)片内128(或者256)字节数据存储器的空间; (3)片外64KB的数据存储器地址空间。 6、片内RAM低128单元划分为哪三个主要部分?各部分主要功能是什么? 片内RAM低128单元划分为三个主要部分: (1)工作寄存器区(00H~1FH),这是一个用寄存器寻址的区域,指令的数量最多,均为单周期指令,执行的速度最快; (2)位寻址区(20H~2FH),包含128位(位地址00H~7FH),是可位寻址的RAM区。这16字节单元即可进行字节寻址,又可实现位寻址。

链表作业

一、选择 1.下述哪一条是顺序存储结构的优点?() A.存储密度大 B.插入运算方便 C.删除运算方便 D.可方便地用于各种逻辑结构的存储表示 2.下面关于线性表的叙述中,错误的是哪一个?()A.线性表采用顺序存储,必须占用一片连续的存储单元。 B.线性表采用顺序存储,便于进行插入和删除操作。 C.线性表采用链接存储,不必占用一片连续的存储单元。 D.线性表采用链接存储,便于插入和删除操作。 3.线性表是具有n 个()的有限序列(n>0)。 A.表元素 B.字符 C.数据元素 D.数据项 E.信息项 4.若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用()存储方式最节省时间。 A.顺序表 B.双链表 C.带头结点的双循环链表 D.单循环链表 5.某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用()存储方式最节省运算时间。 A.单链表 B.仅有头指针的单循环链表 C.双链表 D.仅有尾指针的单循环链表 6.设一个链表最常用的操作是在末尾插入结点和删除尾结点,则选用( )最节省时间。A. 单链表 B.单循环链表 C. 带尾指针的单循环链表 D.带头结点的双循环链表 7.若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一个结点。则采用()存储方式最节省运算时间。 A.单链表 B.双链表 C.单循环链表 D.带头结点的双循环链表 8. 静态链表中指针表示的是(). A.内存地址 B.数组下标 C.下一元素地址 D.左、右孩子地址 9. 链表不具有的特点是() A.插入、删除不需要移动元素 B.可随机访问任一元素 C.不必事先估计存储空间 D.所需空间与线性长度成正比 10. 下面的叙述不正确的是() A.线性表在链式存储时,查找第i 个元素的时间同i 的值成正比 B. 线性表在链式存储时,查找第i 个元素的时间同i 的值无关 C. 线性表在顺序存储时,查找第i 个元素的时间同i 的值成正比 D. 线性表在顺序存储时,查找第i 个元素的时间同i 的值无关 13. 若长度为n 的线性表采用顺序存储结构,在其第i 个位置插入一个新元素的算法的时间复杂度为()(1<=i<=n+1)。 A. O(0) B. O(1) C. O(n) D. O(n2) 14. 对于顺序存储的线性表,访问结点和增加、删除结点的时间复杂度为()。 A.O(n) O(n) B. O(n) O(1) C. O(1) O(n) D. O(1) O(1) 15.线性表( a1,a2,…,an)以链接方式存储时,访问第i 位置元素的时间复杂性为()A.O(i) B.O(1) C.O(n) D.O(i-1) 23.在双向链表指针p 的结点前插入一个指针q 的结点操作是()。 A. p->Llink=q;q->Rlink=p;p->Llink->Rlink=q;q->Llink=q; B. p->Llink=q;p->Llink->Rlink=q;q->Rlink=p;q->Llink=p->Llink; C. q->Rlink=p;q->Llink=p->Llink;p->Llink->Rlink=q;p->Llink=q; D. q->Llink=p->Llink;q->Rlink=q;p->Llink=q;p->Llink=q;

数据结构作业题

答案出错,本宝宝概不负责, 应该没错 作业题 一、填空题: (1) 一个有向图G中若有弧, 则在图G的拓扑序列中,顶点vi,vj 和vk的相对位置为_____ i,j,k _____。 (2)队列是一种_ 线性的结构。 (3) 在单链表中,指针p 所指结点为最后一个结点的条件是p->next == NULL。 (4) 二路归并排序的时间复杂度是__nlogn______。 (5)栈是一种_ 线性的结构。 (6) 由____树____转换成二叉树时,其根结点的右子树总是空的。 (7) 直接选择排序是不稳定的,其时间复杂性为__n2______。 (8) 对无向图,其邻接矩阵是一个关于__ 对角线______对称的矩阵。 (9) 由________转换成二叉树时,其根结点的右子树总是空的。 (10) 归并排序要求待排序列由若干个____有序_______的子序列组成。 (11) 已知一棵度为3的树有2个度为1的结点,3个度为2的结点,4个度为3的结点,则该树中有___ 12 _______ 个叶子的结点。 二、单项选择题: (1)设有一个无向图G=(V,E)和G’=(V’,E’)如果G’为G的生成树,则下面不正确的说法是(B )。 A.G’为G 的子图; B.G’为G 的边通分量; C.G’为G的极小连通子图且V’=V; D.G’为G的一个无环子图。 (2)单链表的一个存储结点包含( D )。 A.数据域或指针域; B.指针域或链域; C.指针域和链域; D.数据域和链域。

(3)二分查找要求被查找的表是( C )。 A. 键值有序的链接表; B.链接表但键值不一定有序; C. 键值有序的顺序表; D.顺序表但键值不一定有序。 (4)设指针P指向双链表的某一结点,则双链表结构的对称性可用(C )式来刻画。 A.p->prior->next->==p->next->next; B.p->prior->prior->==p->next->prior; C.p->prior->next->==p->next->prior; D.p->next->next==p->prior->prior。 (5)顺序查找法适合于( D )存储结构的查找表。 A.压缩; B.散列; C.索引; D.顺序或链式。 (6)在循环链表中,将头指针改设为尾指针(rear)后,其头结点和尾结点的存储位置分别是(B )。 A.real和rear->next->next; B.rear->next 和rear; C.rear->next->next和rear; D.rear和rear->next。 (7)堆是一个键值序列{k1,k2,…, kn},对i=1,2,…,|_n/2_|,满足( C )。 A.ki≤k2i≤k2i+1; B.ki

指针作业

1、有以下程序b main() { int x[8]={8,7,6,5,0,0},*s; s=x+3; printf("%d\n",s[2]); } 执行后输出结果是 A)随机值B)0 C)5 D)6 2、执行以下程序后,a,b的值分别为c main() {int a,b,k=4,m=6,*p1=&k,*p2=&m; a=p1==&m; b=(-*p1)/(*p2)+7; printf("a=%d\n",a); printf("b=%d\n",b); } A)-1,5 B)1,6 C)0,7 D)4,10 3、下面程序中,当输入3个数为4 8 1后,该程序将输出的结果是___d__. main() { int i,j,k,temp; int *p1,*p2,*p3; printf(“Inut 3 number:”); scanf(“%d%d%d”,&i,&j,&k); p1=&i; p2=&j; p3=&k; temp = *p3; *p3 = *p2; *p2 = *p1; *p1 = temp; printf("%d %d %d", i, j, k); } A)4 8 1 B)4 1 8 C)1 8 4 D)1 4 8 4、以下程序中调用scanf函数给变量a输入数值的方法是错误的,其错误原因是a main() {int *p,*q,a,b; p=&a; printf("input a:"); scanf("%d",*p); }

A)*p表示的是指针变量p的地址 B)*p表示的是变量a的值,而不是变量a的地址C)*p表示的是指针变量p的值 D)*p只能用来说明p是一个指针变量 5、有以下程序c main() { char str[]="xyz",*ps=str; while(*ps)ps++; for(ps--;ps-str>=0;ps--) puts(ps); } 执行后的输出结果是 A)yz xyz B)z yz C)z yz xyz D)x xy xyz 6、若有语句int *point,a=4;和point=&a;下面均代表地址的一组选项是c A)a,point,*&a B)&*a,&a,*point C)*&point,*point,&a D)&a,&*point,point 7、下面能正确进行字符串赋值操作的是c A)char s[5]={"ABCDE"}; B)char s[5]={'A','B','C','D','E'}; C)char *s;s="ABCDE"; D)char *s;scanf("%s",s); 8、下面程序段的运行结果是a char *s="abcde"; s+=2;printf("%d",s); A)cde B)字符'c' C)字符'c'的地址D)无确定的输出结果 9、若有下面的程序段:d char s[]="china";char *p; p=s; 则下列叙述正确的是 A)s和p完全相同 B)数组s中的内容和指针变量p中的内容相等 C)sizeof(s)和sizeof(p)相等 D)*p与s[0]相等 编程题:(用指针实现) 1.有一个一维数组int a[]={1,2,3,4,5,6}; 有一个int *p=a;,通过指针p打印出这个一维数 组的每个元素和每个元素的地址。 2.char acbuf[]={“hello”}; char *pstr=acbuf; char *p="hello"; 通过指针打印acbuf的值,并通过指针把acbuf值改为“world”,将p改为"world"。 3.将用户输入的一个正整数n(长整型)输出成“千分位”形式,即从各位数起,每三位间 加一个逗号。如:7654321,输出7,654,321。 4.用指针输入一组数,找出其中最大的数,并把最大的数与第一个互换。

C语言程序设计指针作业

C语言程序设计指针作业 一、选择题 【习题1】变量的指针,其含义是指该变量的________ A)值B)地址 C)名D)一个标志 【习题2】若有语句int *point,a; 则point=&a;中运算符&的含义是_____ A)位与运算B)逻辑与运算 C)取指针内容D)取地址 【习题3】若x是整型变量,pb是整型的指针变量,则正确的赋值表达式是 A) pb=&x B) pb=x; C) *pb=&x; D) *pb=*x 【习题4】下面程序段的运行结果是_________ char *s="abcde"; s+=2; printf("%d",s); A)cde B)字符’c’C)字符’c’的地址D)无确定的输出结果【习题5】设p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确执行的赋值语句是______ A)c=*p1+*p2; B)p2=c C)p1=p2 D)c=*p1*(*p2); 【习题6】若有定义语句 char a[]="It is mine"; char *p="It is mine"; 则以下不正确的叙述是________. A)a+1表示的是字符t的地址 B)p指向另外的字符串时,字符串的长度不受限制 C)p变量中存放的地址值可以改变 D)a中只能存放10个字符 【习题7】若有定义:int a[2][3],则对a数组的第i行j列元素地址的正确引用为___ A)*(a[i]+j) B)(a+i) C)*(a+j) D)a[i]+j 【习题8】设有如下定义:int (*ptr)( ); 则以下叙述中正确的是: A)ptr是指向一维组数的指针变量 B)ptr是指向int型数据的指针变量 C)ptr是指向函数的指针,该函数返回一个int型数据 D)ptr是一个函数名,该函数的返回值是指向int型数据的指针 【习题9】设有定义int (*ptr)[m];其中的标识符ptr是 A)m个指向整型变量的指针 B)指向m个整型变量的函数指针 C)一个指向具有m个整型元素的一维数组的指针 D)具有m个指针元素的一维指针数组,每个元素都只能指向整型量 【习题10】若要用下面的程序片段使指针变量p指向一个存储整型变量的动态

认识钟表前置性作业

《理解钟表》前置性作业 一年级《理解钟表》前置作业 一、教学内容:一年级上册第七单元第一课 二、教材分析:本节课教学目标是使学生结合实际初步学会看钟表,体会钟表在生活中的重要作用,并为今后进一步学习相关时间的知识打下基础。这部分内容在教材中虽然是第一次出现,但学生已具有这方面的一些生活经验。所以,教学中要结合学生的生活经验与实际,使用教材提供的现实情境,向学生充分提供观察、比较和动手操作的机会,展开好教学活动。 三、学情分析:一年级的学生年龄还太小,而且在这个课题的教学中不需考虑秒针,所以我在选用课件时,用了两根指针的钟面的课件(即只有时针和分针)。这样就避免了秒针在学生区分时针和分针时的干扰。在学生区分时针和分针的不同时,我采用的方式是多种多样的,不但安排了男女生互考,而且还安排了师生互考,多样化的记忆方式极大的提升了学生的学习兴趣,加深巩固了学生的印象,而且更为下一个环节初步理解整时奠定了基础。 四、教学目标: 1、借助已有的生活经验,在熟悉的生活情境中交流、合作,学会认读整时。 2、结合日常生活作息时间,培养学生珍惜时间的态度和合理安排时间的良好的习 惯。 3、通过观察、讨论、比较等活动,初步培养学生的探究合作的学习意识。 五、教学重点难点: 教学重点:学会理解钟表的时针和分针,会看钟表上的整时。 教学难点:学会两种表示时间的方法。 六、前置作业: 作业一:观察你家里的钟表,在空白的表盘里填上对应的数字。 作业二:在家长的协助下画出7时钟表两条指针所指的位置。 作业三:画一画。除了上面画的这种钟表,你还见过其他类型的钟表吗?请在下面画一画。(提前一周布置,和家长一起完成,第一课时使用。) 仔细观察下图中的钟面,完成填空。

海大曲少珍C程 作业1:理解指针

作业1:理解指针 一、第一部分:指针的基本概念 1. 下面程序用于验证不同系统下对于指针(地址)变量所分配的字节数。请分别在tc 和cfree或者vc++6.0系统下运行,观察运行结果,分析出指针(地址)变量的性质: #include int main() { int *pi,x; long int *pl,n; char *pc,y; float *pf,z; double *pd,m; printf("sizeof(int)=%d\tsizeof(int *)=%d\n",sizeof(x),sizeof(pi)); printf("sizeof(long)=%d\tsizeof(long *)=%d\n",sizeof(n),sizeof(pl)); printf("sizeof(char)=%d\tsizeof(char *)=%d\n",sizeof(y),sizeof(pc)); printf("sizeof(float)=%d\tsizeof(float *)=%d\n",sizeof(z),sizeof(pf)); printf("sizeof(double)=%d\tsizeof(double *)=%d\n",sizeof(m),sizeof(pd)); } 2.下面程序用于验证初始化前和初始化后指针(地址)变量的引用情况。 #include int main() { int *p,a=3; printf("address of p:%p\n",p); printf("before initialize,*p=%d\n",*p); p=&a; printf("after initialize,*p=%d\n",*p); } 结论:使用未初始化的指针后果是不可预知的,也是危险的。 3.编译运行下面程序会出现什么问题? #include int main() { int *p=0,a=3; printf("address a=%p\n",&a); /*下面语句中请将上面输出结果a的地址编号赋值给变量p,例如若 &a是0240FF58*/ p=0x0240FF58; printf("p=%p\t *p=%d\n",p,*p); } 结论: (1)不允许将整型数值作为地址编号赋值给指针变量,除0外, (2)将0赋值给指针变量即意味着该指针不指向任何的一个空间。也可以说0是唯一一个可以直接复制给指针变量的整型值。 (3)可以赋值给指针变量的内容只可以是有限的形式,如 &变量、数组名、以及地址的各种表达形式。 4. 运行下面程序,根据结果分析指针p 和q的使用 #include void main() { int a=3,*p,*q; p=&a; printf("*p=%d,a=%d\n",*p,a); q=p;

8 指针作业

1、有以下程序 main() { int x[8]={8,7,6,5,0,0},*s; s=x+3; printf("%d\n",s[2]); } 执行后输出结果是D A)随机值B)0 C)5 D)6 2、执行以下程序后,a,b的值分别为C main() {int a,b,k=4,m=6,*p1=&k,*p2=&m; a=p1==&m; b=(-*p1)/(*p2)+7; printf("a=%d\n",a); printf("b=%d\n",b); } A)-1,5 B)1,6 C)0,7 D)4,10 3、下面程序中,当输入3个数为4 8 1后,该程序将输出的结果是__D___. main() { int i,j,k,temp; int *p1,*p2,*p3; printf(“Inut 3 number:”); scanf(“%d%d%d”,&i,&j,&k); p1=&i; //4 p2=&j; //8 p3=&k; //1 temp = *p3; *p3 = *p2; *p2 = *p1; *p1 = temp; printf("%d %d %d", i, j, k); } A)4 8 1 B)4 1 8 C)1 8 4 D)1 4 8 4、以下程序中调用scanf函数给变量a输入数值的方法是错误的,其错误原因是B main() {int *p,*q,a,b; p=&a; printf("input a:"); scanf("%d",*p); }

A)*p表示的是指针变量p的地址 B)*p表示的是变量a的值,而不是变量a的地址C)*p表示的是指针变量p的值 D)*p只能用来说明p是一个指针变量 5、有以下程序 main() { char str[]="xyz",*ps=str; while(*ps)ps++; for(ps--;ps-str>=0;ps--) puts(ps); } 执行后的输出结果是C A)yz xyz B)z yz C)z yz xyz D)x xy xyz 6、若有语句int *point,a=4;和point=&a;下面均代表地址的一组选项是D A)a,point,*&a B)&*a,&a,*point C)*&point,*point,&a D)&a,&*point,point 7、下面能正确进行字符串赋值操作的是C A)char s[5]={"ABCDE"}; B)char s[5]={'A','B','C','D','E'}; C)char *s;s="ABCDE"; D)char *s;scanf("%s",s); 8、下面程序段的运行结果是C char *s="abcde"; s+=2;printf("%d",s); A)cde B)字符'c' C)字符'c'的地址D)无确定的输出结果 9、若有下面的程序段: char s[]="china";char *p; p=s; 则下列叙述正确的是B A)s和p完全相同 B)数组s中的内容和指针变量p中的内容相等 C)sizeof(s)和sizeof(p)相等 D)*p与s[0]相等 编程题:(用指针实现) 1.有一个一维数组int a[]={1,2,3,4,5,6}; 有一个int *p=a;,通过指针p打印出这个一维数 组的每个元素和每个元素的地址。 2.char acbuf[]={“hello”}; char *pstr=acbuf; char *p="hello"; 通过指针打印acbuf的值,并通过指针把acbuf值改为“world”,将p改为"world"。 3.将用户输入的一个正整数n(长整型)输出成“千分位”形式,即从各位数起,每三位间 加一个逗号。如:7654321,输出7,654,321。 4.用指针输入一组数,找出其中最大的数,并把最大的数与第一个互换。

第7章指针 作业二

第九章指针作业二(函数声明略) 一、选择: 1、在定义“int (*p)[5];”中,定义p为()。 A.包含5个元素的一维数组,其中每个元素都是基类型为int的指针 B.基类型为int的指针变量C.包含5个元素的整型一维数组 D.行指针,可用于指向包含5个元素的一维数组 2、在二维数组a中,元素a[0][1]的地址可表示为()。 A.*(*(a+0)+1) B.*(a+1) C.&a D.*a+1 3、若有定义“int aa[3][4], (*ptr)[4]; ptr=aa ;”,则*(ptr+1)+2表示()。 A.aa[2][1]的地址B.aa[1][2]的地址C.元素aa[2][1] D.元素aa[1][2] 4、若有以下定义和语句“float f [3][4], (*p)[4]; p=f ;”,则对f数组元素的正确引用是()。 A.p[3][1] B.(p+1)[2] C.p[1]+2 D.*(p[0]+2) 5、有以下程序段: int s[3][2], *p[3], i , j ; for(i=0; i<3; i++){ p[i]=s[i]; for(j=0; j<2 ; j++ )s[i][ j ]= i+j ; } 执行后值为3的元素是()。 A.*(*(p+2)+1) B.p[2][0] C.(*(p+0))[1] D.*(p[1]+1) 6、与定义“char *p[3];”等价的是()。 A.char *(p[3]); B.char p[3]; C.char (*p)[3]; D.char *p; 7、有以下程序段: int a[3][4], *p[3], **q , i , j ; for ( i=0; i<3; i++ ) p[i]=a[i]; q=p; 执行后表示a数组元素的是()。 A.p[1]+2 B.*(q+1)+2 C.p[2] D.**q 8、若有定义“int a[3][4], *p[3], (*q)[4];”,则以下语句中正确的是()。 A.p=q=a ; B.p=&a[0][0]; C.q=a[0]; D.p[1]=a[2]+1 9、以下定义中,能够执行++a操作的是()。 A.int x[5], *a=x ; B.int a[5]; C.int *a[5]; D.int *(a[5]); 10、main函数可以带有参数,其正确的定义形式是()。 A.void main ( char **argc , int argv ) B.void main ( int a , char (*b)[ ] ) C.void main ( int argc , char *argv ) D.void main ( int a , char **b ) 11、有以下程序: # include void fun ( int , int , int * , int * ); void main ( ) { int a=10, b=3, c=1, d=2 ; fun ( a , b , &c , &d ); printf (“%d ,%d \n”, c , d ); } void fun ( int x , int y , int *p , int *q ) { *p=x+y ; *q=x-y ; } 程序运行后的输出结果是()。 A.10 , 3B.13 , 7 C.1 , 2 D.不确定的值 12、在主函数中若有定义“int a[3][5];”,并用“fun (a);”形式调用了函数fun,则定义该函数时错误的首部形式是()。 A.fun ( int array[ ][5] ) B.void fun ( int (*array)[5] ) C.fun ( int array[3][5] ) D.void fun ( int array[3] ) 13、若主函数中有“int a=2; fun (&a);”,且fun函数的定义如下: void fun ( int *p ) { int b, *q=p ; *p=*p+*q ; *q=*p+b ; b= *p/*q ;p=&b; printf (“%d \n”, *q ); }

C语言指针作业

1.实验目的 (1)掌握指针的概念,会定义使用指针变量; (2)能正确使用变量的指针和指向变量的指针变量;(3)能正确使用数组的指针和指向数组的指针变量;(4)能正确使用字符串的指针和指向字符串的指针变量; 2.实验内容 输入三个整数,按由大到小的顺序输出。 要求: (1)画出算法的流程图。 (2)用scanf函数输入三个数据并存入三个变量之中。(3)利用指针实现从大到小输出。 3.源程序 1. #include 2. void main() 3. 4.{ 5. int a,b,c; 6. int *p1,*p2,*p3,*t; 7. p1=&a;p2=&b;p3=&c; 8. scanf("%d%d%d",p1,p2,p3); 9. if(*p1<*p2) 10. { 11.t=p1; 12.p1=p2; 13.p2=t; 14. } 15. if(*p2<*p3) 16. { 17.t=p2; 18.p2=p3; 19.p3=t; 20. } 21. if(*p1<*p2) 22. {

23.t=p1; 24.p1=p2; 25.p2=t; 26. } 27. printf("%d\t%d\t%d\t",*p1,*p2,*p3); 28.} 4.运行结果 5.出现问题及解决办法 用地址之间的转换即可排序。 6.实验心得 通过该实验,更加熟练的掌握了指针的应用。 1.实验目的 1掌握指针的概念,会定义使用指针变量; 2 能正确使用变量的指针和指向变量的指针变量; 3 能正确使用数组的指针和指向数组的指针变量; 4 能正确使用字符串的指针和指向字符串的指针变量;

第二章 作业答案

第二章作业 1. 描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点)。 答:首结点就是存放数据元素的第一个元素结点,头结点是为了插入和删除的方便说增设的一个结点,头指针是指向链表中第一个结点的存储位置,在没有头结点的链表中,头指针指向链表中的首结点,在有头结点的链表中,头指针指向链表中的头结点。 2. 简述线性表的两种存储结构顺序表和链表的优缺点。 3. 已知 L 是无表头结点的单链表,且 P 是指向表中某个结点的指针,试写出在 P 所指结点之前插入指针 S 所指结点的语句序列。 P->next->next= P->next; S->next = P; 4. 已知 P 是指向双向链表中某个结点的指针,试写出删除 P 所指结点的前驱结点的语句序列。 p是要删除的结点,q是p的前一个结点 q->next = p->next;简述以下算法的功能。 (1) Status A(LinkedList L) { // L 是无表头结点的单链表 if (L && L->next){ Q =L; L =L->next; P =L ; while ( P->next) P =P->next ; P->next =Q; Q->next = NULL; } return OK; } // A 本程序实现的功能就是:如果L的长度不小于2,则将首元结点删去并插入到末尾。(2) void BB(LNode *s, LNode *q ) { p =s ;

while (p->next!=q) p =p->next ; p->next =s; } //BB void AA(LNode *pa, LNode *pb) { // pa 和 pb 分别指向单循环链表中的两个结点 BB(pa, pb); BB(pb, pa); } //AA 如果L的长度不小于2,将L的首元结点变成尾元结点。将单循环链表拆成两个单循环链表。

第二章作业答案

第二章作业答案 -标准化文件发布号:(9456-EUATWK-MWUB-WUNN-INNUL-DDQTY-KII

第二章作业 1. 描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点)。 答:首结点就是存放数据元素的第一个元素结点,头结点是为了插入和删除的方便说增设的一个结点,头指针是指向链表中第一个结点的存储位置,在没有头结点的链表中,头指针指向链表中的首结点,在有头结点的链表中,头指针指向链表中的头结点。 2. 简述线性表的两种存储结构顺序表和链表的优缺点。 3. 已知 L 是无表头结点的单链表,且 P 是指向表中某个结点的指针,试写出在 P 所指结点之前插入指针 S 所指结点的语句序列。 P->next->next= P->next; S->next = P; 4. 已知 P 是指向双向链表中某个结点的指针,试写出删除 P 所指结点的前驱结点的语句序列。 p是要删除的结点,q是p的前一个结点 q->next = p->next;//删除的结点的后一结点的首地址赋值给删除的结点的前一结点的next p->next->prior = q;//删除的结点的后一结点的prior指向删除的结点的前一结点的首地址 5. 简述以下算法的功能。 (1) Status A(LinkedList L) { // L 是无表头结点的单链表 if (L && L->next){ Q =L; L =L->next; P =L ; while ( P->next) P =P->next ; P->next =Q; Q->next = NULL; } return OK; } // A 本程序实现的功能就是:如果L的长度不小于2,则将首元结点删去并插入到末尾。 (2) void BB(LNode *s, LNode *q ) { p =s ; while (p->next!=q) p =p->next ; p->next =s; } //BB void AA(LNode *pa, LNode *pb) { // pa 和 pb 分别指向单循环链表中的两个结点 BB(pa, pb); BB(pb, pa); } //AA 如果L的长度不小于2,将L的首元结点变成尾元结点。

作业1 数据结构

第一次作业——第一章、第二章 一.判断题: 1.数据元素是数据的最小单位。数据项 2.线性表采用链表存储时,结点和结点内部的存储空间可以是不连续的。× 3.在具有头结点的链式存储结构中,头指针指向链表中的第一个数据结点。头结点 4.顺序存储的线性表可以随机存取。√ 5.在单链表中,要访问某个结点,只要知道该结点的指针即可。因此,单链表是一种随机存储结构。× 6.在线性表的顺序存储结构中,插入和删除元素时,移动元素的个数与该元素的位置有关。 √ 7.顺序存储方式插入和删除时效率太低,因此它不如链式存储方式好。× 二.填空题: 1.在一个循环单链表中,表尾结点的指针域和头指针的值相等。 2.对于双向链表,在两个结点之间插入一个新结点时需修改或建立的指针共有 4 个,单链表为2个。 3.求顺序表和单链表长度的时间复杂性分别为O(1)和O(n)。 4.在一个不带头结点的单链表中,在表头插入或删除与其他位置插入或删除其操作过程不同。 5.在线性表的顺序存储中,元素之间的逻辑关系是通过物理位置的邻接关系决定的;在线性表的链式存储中,元素之间的逻辑关系是通过指针域(或链域)决定的。 6.对于一个具有n个结点的单链表,在已知的结点*p后插入一个新结点的时间复杂度为O(1),在给定值为x的结点后插入一个新结点的时间复杂度为O(n) 。 三.选择题: 1.在一个长度为n的顺序表中,在第i个元素(1≤i≤n+1)之前插入一个新元素时需向后移动 b 个元素。 a. n-i b. n-i+1 c. n-i-1 d. i 2.将两个各有n个元素的有序表归并成一个有序表,其最少的比较次数是 a 。 a. n b. 2n-1 c. 2n d. n-1 3.以下说法正确的是 d 。 a. 顺序存储方式的优点是存储密度大且插入、删除运算效率高 b. 链表的每个结点中都恰好包含一个指针 c. 线性表的顺序存储结构优于链式存储 d. 顺序存储结构属于静态结构而链式存储结构属于动态结构 4.以下说法错误的是 a 。 a. 对于循环链表来说,从表中任意结点出发都能通过前后移操作扫描整个循环链表 b. 对于单链表来说,只有从头指针开始才能扫描表中全部结点

第九章 指针作业练习

第九章指针 来自lee_wiki 跳转至:导航、搜索 一、选择题 1.若有说明:int a=2, *p=&a, *q=p;,则以下非法的赋值语句是()。A. p=q; B. *p=*q; C. a=*q; D. q=a; 2.若定义:int a=511, *b=&a;,则printf("%d\n", *b);的输出结果为:A.无确定值 B. a的地址 C. 512 D. 511 3.已有定义int a=2, *p1=&a, *p2=&a; 下面不能正确执行的赋值语句是()。A. a=*p1+*p2; B. p1=a; C. p1=p2; D. a=*p1*(*p2); 4.变量的指针,其含义是指该变量的()。 A.值 B.地址 C.名 D.一个标志 5.若有说明语句:int a, b, c, *d=&c;,则能正确从键盘读入三个整数分别赋给变量a、b、c的语句是()。 A. scanf("%d%d%d", &a, &b, d); B. scanf("%d%d%d", a, b, d); C. scanf("%d%d%d", &a, &b, &d); D. scanf("%d%d%d", a, b,*d); 6.若已定义int a=5; 下面对(1)、(2)两个语句的正确解释是()。(1) int *p=&a; (2) *p=a; A.语句(1)和(2)中的*p含义相同,都表示给指针变量p赋值。 B. (1)和(2)语句的执行结果,都是把变量a的地址值赋给指针变量p。 C. (1)在对p进行说明的同时进行初始化,使p指向a; (2)变量a的值赋给指针变量p。 D. (1)在对p进行说明的同时进行初始化,使p指向a; (2)将变量a的值赋予*p。 7.若有语句int *p, a=10; p=&a; 下面均代表地址的一组选项是()。// &于*是一对反操作,也就是*&或&*相当于什么都没写 A. a, p, *&a B. &*a, &a, *p C. *&p, *p, &a D. &a, &*p, p 8.若有说明:int *p, a=1, b; 以下正确的程序段是()。

作业答案

1. 描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点)。 答:首结点就是存放数据元素的第一个元素结点,头结点是为了插入和删除的方便说增设的一个结点,头指针是指向链表中第一个结点的存储位置,在没有头结点的链表中,头指针指向链表中的首结点,在有头结点的链表中,头指针指向链表中的头结点。 2. 简述线性表的两种存储结构顺序表和链表的优缺点。 3. 已知 L 是无表头结点的单链表,且 P 是指向表中某个结点的指针,试写出在 P 所指结点之前插入指针 S 所指结点的语句序列。 P->next->next= P->next; S->next = P; 4. 已知 P 是指向双向链表中某个结点的指针,试写出删除 P 所指结点的前驱结点的语句序列。 p是要删除的结点,q是p的前一个结点 q->next = p->next;简述以下算法的功能。 (1) Status A(LinkedList L) { // L 是无表头结点的单链表 if (L && L->next){ Q =L; L =L->next; P =L ; while ( P->next) P =P->next ; P->next =Q; Q->next = NULL; } return OK; } // A 本程序实现的功能就是:如果L的长度不小于2,则将首元结点删去并插入到末尾。(2) void BB(LNode *s, LNode *q ) { p =s ; while (p->next!=q) p =p->next ; p->next =s; } //BB void AA(LNode *pa, LNode *pb) { // pa 和 pb 分别指向单循环链表中的两个结点 BB(pa, pb); BB(pb, pa); } //AA 如果L的长度不小于2,将L的首元结点变成尾元结点。 将单循环链表拆成两个单循环链表。

相关文档