搜档网
当前位置:搜档网 › 第十章指针

第十章指针

第十章指针
第十章指针

第十章指针

通过本章实验作业应达目标

1.掌握使用指针变量的方法。

2.掌握带有指针形参的函数的定义及调用方法。

3.正确使用指针操作数组元素。

4.正确使用指针数组操作字符串。

本章上交作业

程序10_1_1.c,10_2_1.c,10_3_1.c,10_4_1.c上传至211.64.135.121/casp。

实验一指针作函数参数

【实验目的】

1.掌握指针概念及定义方法。

2.学会利用指针来求解实际问题。

【实验内容】

作业1.编写一个函数void swap(int *x,int *y),其中的x,y都是指向int的指针,功能是实现x,y所指向的两个int变量的值的交换。并写出函数调用过程。请以10_1_1.c命名本程序。

主函数如下:

main( )

{

void swap(int *x,int *y);

int a,b;

scanf("%d,%d",&a,&b);

printf("before swap: a=%d,b=%d\n",a,b);

此处请写出函数调用过程;

printf("after swap: a=%d,b=%d\n",a,b);

}

【实验提示】

注意指针作为函数参数的写法。

实验二用指针对元素排序

【实验目的】

1.掌握指针概念及定义方法。

2.学会利用指针和数组来求解实际问题。

【实验内容】

作业1.给定主函数,编写三个函数input()、sort()、output(),分别实现数组元素的输入,数组元素的排序(升序)和数组元素的输出。请以10_2_1.c命名本程序。

#include "stdio.h"

int i;

main( )

{

void input(int *a,int n);

void sort(int *a,int n);

void output(int *a,int n);

int a[10];

input(a,10);

sort(a,10);

output(a,10);

}

【实验提示】

1.可以使用数组那一章讲到的任何一种排序算法。

2.本题关键是指向数组的指针变量的应用。由于将数组的首地址赋给了形参指针变量,所以可以在被调函数对指针变量所指向的地址处值的修改可以实现对主函数中数组元素值的修改。

【思考】

1.如果只想对a数组的前5个数排序,该如何调用sort函数?

2.如果只想对a数组的后5个数排序,该如何调用sort函数?

实验三测试是否子串函数

【实验目的】

1.掌握指针概念及定义方法。

2.学会利用指针和数组来求解实际问题。

【实验内容】

作业1.编写一个函数int delnum(int *a , int num , int n),用于在长度是n的数组a中,删除一个指定的元素num。并把删除后数组的长度作为函数的返回值。

请以10_3_1.c命名本程序。

主函数如下:

# define N 10

main( )

{

int a[N] , num;

scanf(“%d”,&num);

输入N个数到数组a中;

调用delnum函数在数组a中删除指定的数num;

输出删除了num后的数组a;

}

实验四字符串的交叉连接

【实验目的】

学会利用多个指针和字符数组来解决实际问题。

【实验内容】

作业1.编写一个函数char *link(char *s1,char *s2),实现字符串s1与s2的交叉连接,连接后得到的新字符串放在s1中,函数返回值为字符数组s1的首地址。请以10_4_1.c命名本程序。

#include

#include

main( )

{

char a[100],b[100];

char *link(char *,char *);

gets(a);

gets(b);

此处请写出link函数的调用过程;

puts(a);

}

例如:

输入abc12345,输出a1b2c345。

输入abcde123,则输出a1b2c3de。

实验五指针数组对多个字符串排序

【实验目的】

1.掌握指针数组的概念及定义方法。

2.学会利用指针数组来解决实际问题。

【实验内容】

作业1.从键盘上输入10个字符串,排序后输出。要求在main( )中输入与输出,用另一函数void strsort(char **p, int n)对它们按字母顺序实行排序,n是指针数组中元素的个数。请以10_5_1.c命名本程序。

主函数如下:

#include

main( )

{

int a[10][100],*pa[10],i;

void strsort(char **p,int n);

for(i=0;i<10;i++)

{

pa[i]=a[i];

gets(p[i]);

}

strsort(pa,10);

for(i=0;i<10;i++)

puts(a[i]);

}

【讨论与思考】

1.比较一下使用指针数组和使用二维数组各自的优缺点。

2.本题是采用交换指针的指向,还是采用交换字符串的位置?哪一种更好?

实验六从母串中删除子串(综合类)

【实验目的】

掌握指针作函数参数的应用。

【实验内容】

作业1.函数delstr的功能是从字符数组a(母串)中删除的所有子串b,并返回数组a的起始地址。(子串有可能出现多次)。请以10_6_1.c命名本程序。

如在"abaaabaacbaababab"中删除"ab",输出为"aaaacba"。

主函数如下:

#include

main( )

{

void delstr(char *a, char * b);

int strss(char *s1,char *s2);

char a[200],b[20];

puts("请输入一个字符串:");

gets(a);

puts("请输入被删的子串:");

gets(b);

delstr(a,b);

puts(a);

}

【实验提示】

本题方法有很多,下面介绍一种逐个字符比较的方法:

1)首先要做的是查找子串在母串中的位置。若母串中字符a[ i ]与子串的第一个字符b[0]相等,则从当前位置开始,比较此后的长度为strlen(b)个字符相等,置标记k=1,则表示b是a的子串,从a[i]开始。

if(a[i]==b[0])

{

for(j=0;b[j]!='\0';j++)

if(a[i+j]!=b[j])

break;

if(b[j]=='\0')

k=1;

}

2)找到后开始删除子串。可以使用strcpy函数,也可以自己使用循环来完成。

for (m=0;a[m]!='\0';m++)

a[i+m]=a[i+x+m];

3)要注意每一次删除之后,要对i 的值减一。对k的值重新赋值为0。为什么?

习题

一、选择题

1.变量的指针,其含义是指该变量的________.

a)值 b)地址

c)名 d)一个标志

2.若有说明;int *p,m=5,n;以下正确的程序段的是________.

a)p=&n; b)p=&n;

scanf("%d",&p); scanf("%d",*p);

c)scanf("%d",&n); d)p=&n;

*p=n; *p=m;

3.若有以下定义,则对a数组元素的正确引用是_________.

int a[5],*p=a;

a) *&a[5] b) a+2 c) *(p+5) d) *(a+2)

4.若有定义:int a[2][3],则对a数组的第i行j列元素地址的正确引用为______.

a) *(a[i]+j) b) (a+i) c) *(a+j) d) a[i]+j

5. 下面程序段的运行结果是_________.

char *s="abcde";

s+=2;printf("%d",s);

a)cde b)字符'c' c)字符'c'的地址 d)无确定的输出结果

6.以下正确的程序段是_________.

a)char str[20]; b)char *p;

scanf("%s",&str); scanf("%s",p);

c)char str[20]; d)char str[20],*p=str;

scanf("%s",&str[2]); scanf("%s",p[2]);

7.若有说明语句

char a[]="It is mine";

char *p="It is mine";

则以下不正确的叙述是________.

a)a+1表示的是字符t的地址

b)p指向另外的字符串时,字符串的长度不受限制

c)p变量中存放的地址值可以改变

d)a中只能存放10个字符

8.下面程序的运行结果是_______.

#include

#include

main()

{

char *s1="AbDeG";

char *s2="AbdEg";

s1+=2;s2+=2;

printf("%d\n",strcmp(s1,s2));

}

a)正数 b)负数 c)零 d)不确定的值

9.下面程序的运行结果是_______.

#include

#include

fun(char *w,int n)

{char t,*s1,*s2;

s1=w;s2=w+n-1;

while(s1

}

main()

{char *p;

p="1234567";

fun(p,strlen(p));

puts(p);

}

a) 7654321 b) 1714171 c) 1711717 d) 7177171

10. 已知说明语句int (*p)[ ];,则下列叙述正确的是:______。

A) p是一个指针变量,它指向一个整型一维数组

B) 是一个指针变量,它指向一个整型数据

C) p是一个指针变量,它指向一个返回值是整数的函数

D) 以上都不对

11.若数组名作实参而指针变量作形参,函数调用实参传给形参的是:。

A)数组的长度B)数组第一个元素的值

C)数组所有元素的值D)数组第一个元素的地址

12. 已知有声明语句char s1[10]= "abcde",s3[10];以下语句中能将s1中存储的字符串和s2中存储的字符串正确交换的是:______。

A)s3=s1,s1=s2,s2=s3;

B)s3[0]=s1[0],s1[0]=s2[0],s2[0]=3[0];

C)strcpy(s3[0],s1[0]),strcpy(s1[0],s2[0]),strcpy(s2[0],s3[0]);

D)strcpy(s3,s1),strcpy(s1,s2),strcpy(s2,s3);

13.设int b[ ]={1,2,3,4},y,*p=b; 则执行语句y=*p++;之后,变量y的值为( )

A)1 B)2 C)3 D)4

二、填空题:

1.以下程序的功能是:通过指针操作,找出三个整数中的最小值并输出。

请填空。

#include "stdlib.h"

main()

{int *a,*b,*c,num,x,y,z;

a=&x;b=&y;c=&z;

printf("输入3个整数:");

scanf("%d%d%d",a,b,c);

printf("%d,%d,%d\n",*a,*b,*c);

num=*a;

if(*a>*b)______;

if(num>*c)______;

printf("输出最小整数:%d\n",num);

}

2.下面程序段的运行结果是________.

char s[80],*sp="HELLO!";

sp=strcpy(s,sp);

s[0]='h';

puts(sp);

3.下面程序段的运行结果是________.

char str[]="abc\0def\0ghi",*p=str;

printf("%s",p+5);

若有定义:int a[]={2,4,6,8,10,12},*p=a;则*(p+1)的值是______. *(a+5)的值是_________.

4.若有以下定义:int a[2][3]={2,4,6,8,10,12};则a[1][0]的值是_____. *(*(a+1)+0))的值是________.

5.以下程序将数组a中的数据按逆序存放,请填空。

#define M 8

main()

{int a[M],i,j,t;

for(i=0;i

i=0;j=M-1;

while(i

{

t=*(a+i);________;*(_______)=t;

i++;j--;

}

for(i=0;i

}

6.若有定义:int a[3][5],i,j;(且0<=i<3,0<=j<5),则a数组中任一元素可用

五种形式引用。它们是:

(1)a[i][j]

(2)*(a[i]+j)

(3)*(*______);

(4)(*(a+i))[j]

(5)*(____+5*i+j)

7.下面程序的运行结果是_________.

main()

{char *a[]={"Pascal","C language","dBase","Coble"};

char (**p)[];

int j;

p=a+3;

for(j=3;j>=0;j--)printf("%s\n",*(p--));

}

8. char (*pa)[10];则pa的类型是:___ ___。

9. 设int a[10],b[3][3];数组元素a[5]和b[1][2]分别用指针表示的形式是_____________和_____________。

10. 下列程序的功能是在数组中同时查找最大元素下标和最小元素下

标,分别存放在main 函数的变量max 和min 中,请填空

#include "stdio.h"

void find(int *a ,int n ,int *max ,int *min)

{

int i;

*max=*min=0;

for(i=1;i

if(a[i]>a[*max])

________;

else if(a[i]

________;

}

void main( )

{

int a[]={5,8,7,6,2,7,3},max,min;

find(________);

printf("\n%d, %d\n",max,min);

}。

11. 36.下面程序的功能是统计字串sub在母串s中出现的次数。请选择填空。

#include "stdio.h"

#include "string.h"

{

char s[80], sub[80];

int n;

gets(s);

gets(sub);

printf("%d\n", count(s,sub));

}

int count( char *p, char *q)

{

int m, n, k, num=0;

for (m=0; p[m]; m++)

for (【1】, k=0; q[k]==p[n]; k++, n++)

if(q[【2】]=='\0')

{ num++; break;}

return (num);

}

12.下面程序的运行结果是________。

void swap(int *a, int *b)

{

int *t;

t=a;

a=b;

b=t;

}

main()

{

int x=3, y=5, *p=&x, *q=&y;

swap(p,q);

printf("%d %d\n", *p, *q);

}

13.下面程序的功能是将字符串中的数字字符删除后输出。请填空。 #include "stdio.h"

#include "malloc.h"

void delnum( char *t)

{

int m, n;

for (m=0,n=0; t[m]!='\0';m++)

if (t[m]<'0' 【1】t[m]>'9')

{ t[n]=t[m]; n++;}

【2】;

}

{

char s[100];

printf("\n input the original string:"); gets(s);

delnum(s);

puts(【3】);

}

第十章 指针

第十章指针 一、选择题 1.变量的指针,其含义是指该变量的_______________。 A) 值B) 地址C) 名D)一个标志 2.已有定义int k=2; int *ptr1, *ptr2;且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值是________________。 A)k=*ptr1+*ptr2 B) ptr2=k C) ptr1=ptr2D)k=*ptr1*(*ptr2) 3.若有定义int *p, m=5,n;以下程序段正确的是________________。 A) p=&n; B) p=&n; scanf("%d",&p); scanf("%d",*p); C) scanf("%d",&n); D) p=&n; *p=n; *p=m; 4.若有定义:int *p1, *p2, m=5, n;以下____________是正确的赋值语句。 A) p1=&m; p2=&p1; B)*p1=*p2; C) p1=&m; p2=p1; D) p1=&m; *p2=*p1; 5.若有int *p, a=4;和p=&a;下面____________均代表地址。 A) a, p, *&a B)&*a, &a, *p C) *&p, *p, &a D)&a, &*p, p 6.若变量已正确定义并且指针p已经指向变量x,则*&x相当于____________。 A) x B) p C) &x D) &*p 7.若定义了int m, n=0, *p1=&m;则下列____________表达式与m=n等价。 A) m=*p1 B)*p1=&*n C) *&p1=&*n D) *p1=*&n; 8. 假如指针p已经指向整型变量x,则(*p)++相当于____________。 A) x++ B) p++ C) *(p++) D) &x++ 9. 对于基类型相同的两个指针变量之间,不能进行的运算是____________。 A) < B) = C) + D) - 10. 若程序中已包含头文件stdio.h,以下选项中正确运用指针变量的程序段是__________。 A) int *i=NULL; B) float *f=NULL scanf("%d",i); *f=10.5; C) char t='m',*c=&t; D) long *L; *c=&t; L='\0'; 11. 有如下函数和变量定义int a=25; 执行语句print_value(&a);后的输出结果是___________。 void print_value(int *x) { printf("%d",++*x); } A) 23 B) 24 C) 25 D) 26 12. 若有定义:char s[10]; 则在下面表达式中不表示s[1]的地址的是___________。 A) s+1 B) s++ C) &s[0]+1 D) &s[1] 13.若有定义:int a[5], *p=a; 则对a数组元素的正确引用是_____________。 A)*&a[5]B)a+2 C)*(p+5) D)*(a+2) 14. 若有定义:int a[5], *p=a; 则对a数组元素地址的正确引用是_____________。 A)p+5B)*a+1 C)&a+1 D)&a[0] 15. 若有定义:int a[5]; 则a数组中首元素的地址可以表示为_____________。 A)&a B)a+1 C)a D)&a[1] 16. 若要对a进行合法的自减运算,则之前应有下面___________的说明。 A) int p[3]; B) int k; C) char *a[3]; D) int b[10];

C程序设计第三版第十章题解

第十章指针 10.1 输入3个整数,按照从小到大的顺序输出 #include void main() { void swap(int *p1, int *p2); int n1,n2,n3; int *p1,*p2,*p3; printf("input three integer:"); scanf_s("%d,%d,%d",&n1,&n2,&n3); p1=&n1; p2=&n2; p3=&n3; if(n1>n2) swap(p1,p2); if(n1>n3) swap(p1,p3); if(n2>n3) swap(p2,p3); printf("the order: %d,%d,%d\n",n1,n2,n3); } void swap(int *p1, int *p2) { int temp; temp=*p1; *p1=*p2; *p2=temp; } NOTE:scanf的参数为地址,printf参数为参数 10.2输入三个字符串,按照从小到大的顺序输出 #include #include void main() { void swap(char *p1, char *p2); char str1[20],str2[20],str3[20]; printf("input three string:"); gets_s(str1); gets_s(str2); gets_s(str3); if(strcmp(str1,str2)) swap(str1,str2);

if(strcmp(str1,str3)) swap(str1,str3); if(strcmp(str2,str3)) swap(str2,str3); printf("the order: %s,%s,%s\n",str1,str2,str3); } void swap(char *p1, char *p2) { char temp[20]; strcpy(temp,p1); strcpy(p1,p2); strcpy(p2,temp); } NOTE:gets()用于获取字符串输入。strcmp() 和strcpy()的应用 10.3 输入10个整数,将其中最小的数和第一个数对换,把最大的数和最后一个数对换,写三个函数:①输入十个数;②进行处理;③输出十个数 #include void main() { void input(int *); void output(int *); void proceed(int *); int number[10]; input(number); proceed(number); output(number); } void input(int *number) { int i; printf("input ten integer:\n"); for (i=0;i<10;++i) { scanf("%d",&number[i]); } } void proceed(int *number)

第10章指针类型习题及答案

第十章指针类型习题及其答案 10-2 定义指针变量p,q,r,让它们指向变量a,b,c,在指向d,e,f,最后指向变量x,y,z,然后输出p,q,r与*p,*q,*r. 解:int a,b,c,d,e,f,x,y,z ; int *p,*q,*r ; p=&a;q=&b;r=&c ; p=&d;q=&e;r=&f ; p=&x;q=&y;r=&z ; printf(“%l,%l,%l”,p,q,r) ; printf(“%d,%d,%d”,*p,*q,*r) ; 思考:指针也是一种数据类型吗?他可以不依赖其它数据类型而独立存在吗? 10-3 应用指针,实现10个整数从打到小的排序输出。 解:#include "stdio.h" void main() { int i,j,a[10],*p,t; printf("请输入10个整数:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=0;i<9;i++) { p=&a[i] ; for(j=i+1;j<10;j++) if(a[j]>*p) p=&a[j] ; t=*p;*p=a[i];a[i]=t; } printf("排序后的数组为:\n"); for(i=0;i<10;i++) printf("%d,",a[i]) ; } 思考:指针变量的值可以由键盘输入确定吗?它与其所指类型的变量值之间的关系如何?

10-4 应用指针,求n个数的最小值和最大值。 解:#include "stdio.h" #define L 100 void main() { int i,n,a[L],*max,*min; printf("请确定欲输入数据的个数(<100):"); scanf("%d",&n); printf("下面请依次输入%d的个数\n",n); for(i=0;i*max) max=&a[i]; if(a[i]<*min) min=&a[i]; } printf("最大值=%4d,最小值=%4d\n",*max,*min); } 思考:指针也可以指向相同类型的数组元素,此题如用指针来表示来表示数组的各元素的值,程序应如何设计? 10-5 应用指针,编写下列字符串处理函数: (1) 字符串的复制函数。 (2) 字符串的连接函数。 解:#include "stdio.h" void copy_string(char *from ,char *to) { for(;*from!='\0';from++,to++) *to=*from ; *to='\0';

第十章(指针)

1.补充程序,程序实现从10个数中找出最大值和最小值。 #include #include int max,min; void find_max_min(int *p,int n) { int *q; max=min=*p; for(q=p; q*q) min=*q; } void main() { int i,num[10]; printf("Input 10 numbers: "); for(i=0;i<10;i++) scanf("%d",&num[i]); find_max_min(/**/ num /**/,10); printf("max=%d,num=%d\n",max,min); } 2.补充程序,其中main函数通过调用average函数计算数组元素的平均值。 #include float average(int *pa,int n) { int k; /**/ float avg=0; /**/ for(k=0;k #include

第十章 指针(含答案)

第十章指针 一、选择题 1.以下程序的运行结果是【C】。 sub(int x,int y,int *z) {*z=y-x ;} main() { int a, b,c; sub(10,5,&a); sub(7,a,&b); sub(a,b,&c); printf(”%4d,%4d,%4d\n”,a,b,c); } A. 5,2,3 B. -5,-12,-7 C.-5,-12,-17 D. 5,-2,-7 2.若已定义 char s[10]; 则在下面表达式中不表示s[1]的地址的是【 B 】 A)s+1 B)s++ C)&s[0]+1 D)&s[1] 3.下列程序能对两个整型变量的值进行交换。以下正确的说法是【 D】。 main() { int a=10,b=20; printf("(1)a=%d,b=%d\n",a,b); swap(&a,&b); printf(“(2)a=%d,b=%d\n”a,b); } swap(int p, int q) { int t; t=p;p=q;q=t;} A. 该程序完全正确 B. 该程序有错,只要将语句swap(&a,&b);中的参数改为a,b即可 C. 该程序有错,只要将swap()函数中的形参p和q以及t均定义为指 针(执行语句不变)即可 D. 以上说法都不正确 4.有四组对指针变量进行操作的语句,以下判断正确的选项是【】。 (1)int *p,*q; q=p; int a,*p,*q;p=q=&a; (2)int a,*p,*q; q=&a; p=*q; int a=20, *p; *p=a; (3)int a=b=0,* p; p=&a; b=* p; int a=20,*p,*q=&a; *p=*q; (4)int a=20,*p,*q=&a; p=q; int p, *q; q=&p; A.正确:(1);不正确:(2),(3),(4) B.正确:(l),(4);不正确:(2),(3) C.正确:(3);不正确:(1),(2),(4) D.以上结论都不正确 5.以下程序中调用scanf函数给变量a输入数值的方法是错误的,其错误原因是【】。

C语言第十章习题答案

C程序设计[谭浩强](第三版)课后答案第十章指针2010-06-25 14:04 第十章指针 10.1 main() {int n1,n2,n3; int *p1,*p2,*p3; scanf("%d,%d,%d",&n1,&n2,&n3); p1=&n1; p2=&n2; p3=&n3; if(n1>n2)swap(p1,p2); if(n1>n3)swap(p1,p3); if(n2>n3)swap(p2,p3); printf("%d,%d,%d\n",n1,n2,n3); } swap(p1,p2) int *p1,*p2; {int p; p=*p1;*p1=*p2;*p2=p; } 10.2 main() {char *str1[20],*str2[20],*str3[20]; char swap(); scanf("%s",str1); scanf("%s",str2); scanf("%s",str3); if(strcmp(str1,str2)>0)swap(str1,str2); if(strcmp(str1,str3)>0)swap(str1,str3); if(strcmp(str2,str3)>0)swap(str2,str3); printf("%s\n%s\n%s\n",str1,str2,str3); } char swap(p1,p2) char *p1,*p2; {char *p[20]; strcpy(p,p1); strcpy(p1,p2); strcpy(p2,p); } 10.3 main() {int number[10]; input(number);

第十章练习题

第十章练习题 一、选择题 1.将逻辑值赋给内存变量LZ的正确方法是: A)LZ=“.T.”B)STORE “T” TO LZ C)LZ=TRUED)STORE .T. TO LZ 2.将98年国庆节的日期赋给内存变量ND的正确方法是: A)ND=DTOC(“10/01/98”)B)ND=CTOD([10/01/98]) C)STORE DATE()TO NDD)STORE 10/01/98 TO ND 3.执行命令INPUT “请输入出生日期:” TO MDATE时,如果通过键盘输入CTOD(“01/01/88”)则内存变量MDATE的值应当是: A)CTOD(“01/01/88”)B)“01/01/88” C)日期值01/01/88D)拒绝接收,MDATE不赋值 4.在DO WHILE .T.的循环中,退出循环应使用的命令是: A)LOOPB)EXITC)CLOSED)CLEAR 5.下列程序的运行结果是: A=10 IF A=10 S=0 ENDIF S=1 ?S A)0B)1C)程序出错D)结果无法确定 6.有如下的程序: M=0

N=0 DO WHILE N>M M=M+N N=N-10 ENDDO ?M 运行此程序后M的值为: A)0B)10C)100D)99 7.有如下程序: SET TALK OFF STORE 2 TO S,K DO WHILE S<14 S=S+K K=K+2 ENDDO ?S,K SET TALK ON RETURN 此程序运行后的输出结果是: A)2210B)228 C)148D)14108.执行如下程序:SET TALK OFF S=0 I=1

数据结构严蔚敏版第十章答案

第十章内部排序 10.23 void Insert_Sort1(SqList &L)//监视哨设在高下标端的插入排序算法 { k=L.length; for(i=k-1;i;--i) //从后向前逐个插入排序 if(L.r[i].key>L.r[i+1].key) { L.r[k+1].key=L.r[i].key; //监视哨 for(j=i+1;L.r[j].key>L.r[i].key;++j) L.r[j-1].key=L.r[j].key; //前移 L.r[j-1].key=L.r[k+1].key; //插入 } }//Insert_Sort1 10.24 void BiInsert_Sort(SqList &L)//二路插入排序的算法 { int d[MAXSIZE]; //辅助存储 x=L.r.key;d=x; first=1;final=1; for(i=2;i<=L.length;i++) { if(L.r[i].key>=x) //插入前部 { for(j=final;d[j]>L.r[i].key;j--) d[j+1]=d[j]; d[j+1]=L.r[i].key; final++; } else //插入后部 { for(j=first;d[j]

第十章 指针

第十章指针 本章重点: 指针变量和指针运算符。 指针用作函数参数。 指针与数组。 10.1指针的基本概念 一、地址 在计算机中,把内存区划分为一个一个的存储单元,每个单元为一个字节(8位),它们都有一个编号,这个编号就是内存地址。如下图所示: 注意:1、程序中定义的每个数据在编译后都占有各自的内存区。 2、数据所占有的存储单元个数是由其类型决定的。 3、首地址:第1个单元的地址, 4、表示地址的数与整数的区别: 5、系统通过变量名对内存单元进行访问 2.数据在内存中的存储 整型变量---分配2个字节单元 实型变量—分配4个字节单元 字符变量—分配1个字节单元

2.内存单元的地址与内存单元的内容。 printf(“%d”,i); scanf(“%d”,&i); 的操作过程。 3.对变量值的访问方式 (1)直接访问:按变量地址存取变量值的方式。 (2)间接访问方式:将变量的地址存放在另一个变量当中,通过对另一变量来访问变量。 4.指针:就是变量的地址。 指针变量:用于存放变量地址的变量。 10.2 指针变量和指针运算符 一.指针变量的定义 1.格式:类型名*指针变量名; 2、举例 int *p1; char *s1, *s2; float *a1, *a2, f; 3、说明 a. 类型名:指针变量所指向的变量类型。 b. “*” 是定义指针变量的标志,不可丢掉。 c. 指针变量定义后,其值是不确定的。 4、赋值:可以进行初始化,也可以使用赋值语句 (1)、初始化:int a, *s=&a;

(2)、赋值语句 int a, *s; s=&a; 3)、注意:只能用同类型变量的地址进行赋值! 如定义:int *s; float f; 则s=&f;是非法的。 二. 指针变量的引用 1、两个运算符:& 与* &:取地址,注意与作位运算符时的不同(双目) *:取内容,注意与作乘运算符时的不同(双目) 2、说明 a. &既可作用于一般变量,也可作用于指针变量 b. * 只能作用于指针变量 c. 定义指针变量时的* 与该处的含义不同 3、指针变量可以进行的操作 (1)赋值:int a, *p1=&a, *p2; p2=p1; 下面的赋值是不合法的: int *ip; ip=100; 假设: int i=200, x; int *ip; ip=&i; x=*ip; 通过指针变量ip间接访问变量i, (2)输出:printf(“%x”,p1); (3)增减:p1++; p2--; p1+=4; (只能和一个整数) p+n 不论指针变量指向何种数据类型, 指针和整数进行加、减运算时, 编译程序总根据所指对象的数据长度对n放大。 (4). 两个指针变量在一定条件下, 可进行 减法运算。设p, q指向同一数组, 则p-q的绝对 值表示p所指对象与q所指对象之间的元素个 数。 例1 #include main( ) { int a1=11, a2=22; int *p1, *p2;

C语言 第十章 指针

第十章指针 A部分(本、专科必做) 一、选择题 1、若有定义:int x,*pb;则以下正确的表达式是(A) A、pb=&x B、pb=x C、*pb=&x D、*pb=*x 2、以下程序的输出结果是(B) A、因变量无定义输出不定值 B、0 C、-1 D、1 #include void main() {printf(“%d\n”,NULL);} 3、以下程序的输出结果是(B) A、5,2,3 B、-5,-12,-7 C、-5,-12,-17 D、5,-2,-7 #include void sub(int x,int y,int *z) {*z=y-x;} void main() { int a,b,c; sub(10,5,&a); sub(7,a,&b); sub(a,b,&c); printf(“%d,%d,%d\n”,a,b,c); } 4、以下程序的输出结果是(C) A、4 B、6 C、8 D、10 #include void main() { int k=2,m=4,n=6; int *pk=&k,*pm=&m,*p; *(p=&n)=*pk*(*pm); printf(“%d\n”,n); }

5、已知指针p的指向(图一)的a[1],则执行语句*p++;后,*p的值是(B)。 A、20 B、30 C、21 D、31 a[0] a[1] a[2] a[3] a[4] 10 20 30 40 50 (图一) 6、已知指针p的指向(图一)的a[1],则表达式*++p的值是(B)。 A、20 B、30 C、21 D、31 7、已知指针p的指向(图一)的a[1],则表达式++*p的值是(C)。 A、20 B、30 C、21 D、31 8、以下程序的输出结果是(D)。 A、23 B、24 C、25 D、26 #include void prtv(int *x) {printf(“%d\n”,++*x);} void main() { int a=25;prtv(&a); } 9、以下程序的输出结果是(B)。 A、运行出错 B、100 C、a的地址 D、b的地址 #include void main() { int **k,*a,b=100; a=&b;k=&a; printf(“%d\n”,**k); }

第十章 习题及答案

第十章习题 一、选择题 1.以下叙述中正确的是________。 A)C语言中的文件是流式文件,因此只能顺序存取数据 B)打开一个已存在的文件并进行了写操作后,原有文件中的全部数据必定被覆盖 C)在一个程序中当对文件进行了写操作后,必须先关闭该文件然后再打开,才能读到第1个数据 D)当对文件的读(写)操作完成之后,必须将它关闭,否则可能导致数据丢失 2.当已存在一个abc.txt文件时,执行函数fopen (“abc.txt”, “r++”)的功能是。 A)打开abc.txt文件,清除原有的内容 B)打开abc.txt文件,只能写入新的内容 C)打开abc.txt文件,只能读取原有内容 D)打开abc.txt文件,可以读取和写入新的内容 3.若fp是指向某文件的指针,且已读到此文件末尾,则库函数feof(fp)的返回值是。 A) EOF B) 0 C) 非零值 D) NULL 4.以下程序企图把从终端输入的字符输出到名为abc.txt的文件中,直到从终端读入字符#号时结束输入和输出操作,但程序有错。 #include main() { FILE *fout; char ch; fout=fopen('abc.txt','w'); ch=fgetc(stdin); while(ch!='#') { fputc(ch,fout); ch =fgetc(stdin); fclose(fout); } 出错的原因是。 A) 函数fopen调用形式有误 B) 输入文件没有关闭 C) 函数fgetc调用形式有误

D) 文件指针stdin没有定义 5.有以下程序 #include main() { FILE *pf; char *s1=〞China〞,*s2=〞Beijing〞; pf=fopen(〞abc.dat〞,〞wb+〞); fwrite(s2,7,1,pf); rewind(pf); fwrite(s1,5,1,pf); fclose(pf); } 以下程序执行后abc.dat文件的内容是 A)China B)Chinang C)ChinaBeijing D)BeijingChina 6.有以下程序 #include main () {FILE *fp; int i,a[6]={1,2,3,4,5,6}; fp=fopen(“d3.dat”,”w+b”); fwrite(a,sizeof(int),6,fp); fseek(fp,sizeof(int)*3,SEEK_SET); fread(a,sizeof(int),3,fp); fclose(fp); for(i=0;i<6;i++) printf(“%d,”,a[i]); } 程序运行后的输出结果是( ) A)4,5,6,4,5,6, B)1,2,3,4,5,6, C)4,5,6,1,2,3, D)6,5,4,3,2,1, 7.有以下程序 #include main() {FILE *fp; int a[10]={1,2,3},i,n; fp=fopen(“dl.dat”,”w”); for(i=0;i<3;i++) fprintf(fp,”%d”,a[i]); fprintf(fp,”\n”); fclose(fp); fp=fopen(“dl.dat”,”r”); fscanf(fp,”%d”,&n); fclose(fp); printf(“%d\n”,n);

第十章指针上机习题

第十章指针 问题与思考 一、选择题 1.变量的指针,其含义是指该变量的________. a)值 b)地址 c)名 d)一个标志 2.若有说明;int *p,m=5,n;以下正确的程序段的是________. a)p=&n; b)p=&n; scanf("%d",&p); scanf("%d",*p); c)scanf("%d",&n); d)p=&n; *p=n; *p=m; 3.若有以下定义,则对a数组元素的正确引用是_________. int a[5],*p=a; a) *&a[5] b) a+2 c) *(p+5) d) *(a+2) 4.若有定义:int a[2][3],则对a数组的第i行j列元素地址的正确引用为______. a) *(a[i]+j) b) (a+i) c) *(a+j) d) a[i]+j 5. 下面程序段的运行结果是_________. char *s="abcde"; s+=2;printf("%d",s); a)cde b)字符'c' c)字符'c'的地址 d)无确定的输出结果 6.以下正确的程序段是_________. a)char str[20]; b)char *p; scanf("%s",&str); scanf("%s",p); c)char str[20]; d)char str[20],*p=str; scanf("%s",&str[2]); scanf("%s",p[2]); 7.若有说明语句 char a[]="It is mine"; char *p="It is mine"; 则以下不正确的叙述是________. a)a+1表示的是字符t的地址 b)p指向另外的字符串时,字符串的长度不受限制 c)p变量中存放的地址值可以改变 d)a中只能存放10个字符 8.下面程序的运行结果是_______. #include #include main() { char *s1="AbDeG"; char *s2="AbdEg"; s1+=2;s2+=2; printf("%d\n",strcmp(s1,s2)); }

第十章补充习题

第十章补充习题1 一、选择题 1、若有定义:int x,*pb; 则以下正确的赋值表达式是 A)pb=&x B)pb=x C)*pb=&x D)*pb=*x 2. 以下程序的输出结果是 A)5,2,3 B)-5,-12,-7 C)-5,-12,-17 D)5,-2,-7 void sub(int x,int y,int *z) { *z=y-x; } main() { int a,b,c; sub(10,5,&a);sub(7,a,&b);sub(a,b,&c); printf("%d,%d,%d\n",a,b,c); } 3. 以下程序的输出结果是 A)4 B)6 C)8 D)10 main() { int k=2,m=4,n=6; int *pk=&k, *pm=&m, *p; *(p=&n)= *pk*(*pm); printf(―%d\n‖,n); } 4. 已知指针p的指向如图10.1所示,则执行语句*p++;后,*p的值是 A)20 B)30 C)21 D)31 5. 已知指针p的指向如图10.1所示,则表达式*++p的值是 A)20 B)30 C)21 D)31 6. 已知指针p的指向如图10.1所示,则表达式++*p的值是 A)20 B)30 C)21 D)31 7. 以下程序的输出结果是 A)23 B)24 C)25 D)26 void prtv(int *x) { printf(―%d\n‖,++*x); } main()

{ int a=25;prtv(&a); } 8. 以下程序的输出结果是 A)运行出错B)100 C)a的地址D)b的地址main() { int **k,*a,b=100; a=&b;k=&a; printf("%d\n",**k); } 9. 以下程序的输出结果是 A)4,3 B)2,3 C)3,4 D)3,2 void fun(float *a,float *b) { float w ; *a=*a+*a; w=*a; *a=*b; *b=w; } main() { float x=2.0,y=3.0; float *px=&x,*py=&y; fun(px,py); printf("%2.0f,%2.0f\n ",x,y); } 10. 以下程序的输出结果是 A)9.000000 B)1.500000 C)8.000000 D)10.500000 void sub(float x,float *y,float *z) { *y=*y-1.0; *z=*z+x; } main() { float a=2.5,b=9.0,*pa,*pb; pa=&a; pb=&b; sub(b-a,pa,pa); printf("%f\n ",a); } 二、填空题 1. 以下程序的输出结果是。 int *var,ab; ab=100;var=&ab;ab=*var+10; printf("%d\n",*var);

补充练习第十章文件

补充练习第十章文件 第十章文件 一、单项选择题: 1.C语言把文件看作是一个的序列。 A. 记录 B. 单词 C. 字 D. 字符 2. 语句FILE *fp;定义了一个指向 . A. 某一个文件的变量 B. 某一个文件的结构体变量 C. FILE文件的变量 D. FILE变量的指针 3.标准输入文件由系统分配为。 A. 键盘 B. 显示器 C. 打印机 D. 鼠标 4.语句fp=fopen(“file1”,”r”); 表示。 A. 打开文件file1,可从该文件输入数据 B. 打开文件file1,可向该文件输出数据 C. 打开文件file1,可向该文件添加数据 D. 打开文件file1,可向该文件输入输出数据 5. 如果希望向文本文件末尾添加数据,则应以方式打开文件。 A. “r” B. “w” C. “a” D. “ab” 6.关闭文件函数fclose(fp)的作用是。 A. 不再为fp指向的文件分配内存空间 B. 将fp指向的文件存入磁盘 C. 释放指定文件所占据的内存空间和文件指针 D. 将指定文件封闭在某一内存区域 7. 下面列出四组函数名,其中组为标准文件的输出函数。 A. getchar(),gets(),scanf() B. putchar(),puts(),printf() D. fgetc(),fgets(),fscanf() D. fputc(),fputs(),fprintf() 8. 文件是以为结束符的。 A. NULL B. EOF C. $ D. \n 9.若对文件fp操作出错,则函数ferror(fp)的返回值为。 A. 0 B. –1 C. 1 D. 非零 10. 已知函数fread的调用形式为fread(buffer, size, count, fp),其中buffer代表的

谭浩强版C语言的第十章《指针》答案

谭浩强版C语言的第十章《指针》答案 第十章《指针》答案如下 inc/testPtr.h #include #include #include #include #define SIZE 1024 int a2i(char *start, char *end) { int size = 0, ret = 0; long base = 0; size = end - start + 1; base = (long)pow(10, size - 1); while(size-- > 0) { ret += (*start++ - '0') * base; base /= 10; } return ret; } int extraNum(char *str, int arr[]) { int ite = 0, counter = 0; char *start = NULL, *end = NULL; while(*str != '\0') { if(isdigit(*str)) { start = end = str; while( isdigit(*end) && *end != '\0') { ++end; }

arr[ite++] = a2i(start, end-1); str = end; } else { str++; } } return ite; } int sortStr(char *arr[], int size) { int ite1 = 0, ite2 = 0, minPos = 0; char *tmp; for(ite1 = 0; ite1 < size - 1; ite1++) { minPos = ite1; for(ite2 = ite1 + 1; ite2 < size; ++ite2 ) { if( strcmp(arr[ite2], arr[minPos]) < 0 ) { minPos = ite2; } } if(minPos != ite1) { tmp = arr[minPos]; arr[minPos] = arr[ite1]; arr[ite1] = tmp; } } return 0; } int sort(int arr[], int size) {

第十章指针

第十章指针 通过本章实验作业应达目标 1.掌握使用指针变量的方法。 2.掌握带有指针形参的函数的定义及调用方法。 3.正确使用指针操作数组元素。 4.正确使用指针数组操作字符串。 本章上交作业 程序10_1_1.c,10_2_1.c,10_3_1.c,10_4_1.c上传至211.64.135.121/casp。 实验一指针作函数参数 【实验目的】 1.掌握指针概念及定义方法。 2.学会利用指针来求解实际问题。 【实验内容】 作业1.编写一个函数void swap(int *x,int *y),其中的x,y都是指向int的指针,功能是实现x,y所指向的两个int变量的值的交换。并写出函数调用过程。请以10_1_1.c命名本程序。 主函数如下: main( ) { void swap(int *x,int *y); int a,b; scanf("%d,%d",&a,&b); printf("before swap: a=%d,b=%d\n",a,b); 此处请写出函数调用过程; printf("after swap: a=%d,b=%d\n",a,b); } 【实验提示】 注意指针作为函数参数的写法。 实验二用指针对元素排序 【实验目的】 1.掌握指针概念及定义方法。 2.学会利用指针和数组来求解实际问题。 【实验内容】 作业1.给定主函数,编写三个函数input()、sort()、output(),分别实现数组元素的输入,数组元素的排序(升序)和数组元素的输出。请以10_2_1.c命名本程序。 #include "stdio.h" int i;

main( ) { void input(int *a,int n); void sort(int *a,int n); void output(int *a,int n); int a[10]; input(a,10); sort(a,10); output(a,10); } 【实验提示】 1.可以使用数组那一章讲到的任何一种排序算法。 2.本题关键是指向数组的指针变量的应用。由于将数组的首地址赋给了形参指针变量,所以可以在被调函数对指针变量所指向的地址处值的修改可以实现对主函数中数组元素值的修改。 【思考】 1.如果只想对a数组的前5个数排序,该如何调用sort函数? 2.如果只想对a数组的后5个数排序,该如何调用sort函数? 实验三测试是否子串函数 【实验目的】 1.掌握指针概念及定义方法。 2.学会利用指针和数组来求解实际问题。 【实验内容】 作业1.编写一个函数int delnum(int *a , int num , int n),用于在长度是n的数组a中,删除一个指定的元素num。并把删除后数组的长度作为函数的返回值。 请以10_3_1.c命名本程序。 主函数如下: # define N 10 main( ) { int a[N] , num; scanf(“%d”,&num); 输入N个数到数组a中; 调用delnum函数在数组a中删除指定的数num; 输出删除了num后的数组a; } 实验四字符串的交叉连接 【实验目的】 学会利用多个指针和字符数组来解决实际问题。

10第十章 文件习题

第十章文件 【例1】若fp已正确定义并指向某个文件,当未遇到该文件结束标志时函数feof(fp)的值为________。 A) 0 B) 1 C) -1 D) 一个非0值【例2】设fp是指向某个文件的指针,且已读到文件末尾,则库函数feof(fp)的返回值是________。 A) EOF B) -1 C) 非零值 D) NULL 【例3】以下程序企图把从终端输入的字符输入的字符输出到名为abc.txt的文件中,直到从终端读入字符#号时结束输入和输出操作,但程序有错。 #include Main() { FILE*fout; char ch; Fout=fopen(ˊabc.txtˊ, ˊwˊ); Ch = fgetc(stdin); While(ch != ˊ#ˊ) { fputc(ch,fout); Ch = fgetc(stdin); } Fclose(fout); } 出错的原因是_______。 A) 函数fopen调用形式错误 B)输入文件没有关闭 C) 函数fgetc调用形式错误 D)文件指针stdin没有定义【例4】若要指定打开c盘上子目录myfile下的二进制文件test.bin,在调用函数fopen时,第一个函数的正确格式是_________。 A)“c:myfile\test.bin” B)“c\:myfile\\test.bin” C)“c\\:myfile\\test.bin” D)“c\:myfile\test.bin” 【例5】若要用fopen函数打开一个新的二进制文件,该文件既要能读也要能

写,则文件方式字符串是________。 A)“ab+” B)“wb+” C)“rb+” D)“ab” 【例6】在C语言中,用于关闭文件的函数是_______。 A)fopen B)fseek C)fclose D)ftell 【例7】正常执行文件关闭操作时,fclose函数的返回值是________。 A)-1 B)TRUE C)0 D)1 【例8】已知函数的调用形式是:fread(buffer,size,count,fp);其中buffer 代表的是__________。 A)一个整型变量,代表要读入的数据总数 B)一个文件指针,只想要读 的文件 C)一个指针,只想要读入数据的存放地址 D)一个存储 区,存放要读的数据项 【例9】在C程序中,把整型数以二进制形式存放到文件中的函数是________。 A)fprintf函数 B)fread函数 C)fwrite函数 D)fputc 函数 【例10】fwrite函数的一般调用形式是_________。 A)fwrite(buffer,count,size,fp); B)fwrite(fp,size,count,buffer); C)fwrite(fp,count,size,buffer); D) fwrite(buffer,size,count,fp); 【例11】在C语言中,用于向文件写入一个字符的函数是________。 A)fputs B)fgetc C)fgets D)fputc 【例12】若调用fputc函数输出字符成功,则其返回值是__________。 A)EOF B)1 C)0 D)输出的字符 【例13】函数调用语句fseek(fp,-20L,2);的含义是__________。 A)将文件位置指针移到距离文件头20个字节处 B)将文件位置指针从当前位置向后移动20个字节

相关主题