文档库 最新最全的文档下载
当前位置:文档库 › 课后习题指针

课后习题指针

课后习题指针
课后习题指针

指针

一、单项选择题

1. 已知:int a, *y=&a;则下列函数调用中错误的是。

A) scanf("%d", &a);B) scanf("%d", y);

C) printf("%d", a);D) printf("%d", y);

2. 说明语句"int (*p)( );"的含义是。

A) p是一个指向一维数组的指针变量

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

C) p是一个指向函数的指针,该函数的返回值是一个整型

D) 以上都不对

3. 设有说明int (*p)[4];其中的标识符p是。

A) 4个指向整型变量的指针变量

B) 指向4个整型变量的函数指针

C) 一个指向具有4个整型元素的一维数组的指针

D) 具有4个指向整型变量的指针元素的一维指针数组

4. 已知:char s[10], *p=s,则在下列语句中,错误的语句是。

A) p=s+5;B) s=p+s;C) s[2]=p[4];D) *p=s[0];

5. 已知:char s[100];int i;则引用数组元素的错误的形式是。

A) s[i+10] B) *(s+i) C) *(i+s) D) *((s++)+i)

6. 已知:char s[6], *ps=s;则正确的赋值语句是。

A) s="12345";B) *s="12345"; C) ps="12345";D) *ps="12345";

7. 已知:char a[3][10]={"BeiJing","ShangHai","TianJin"}, *pa=a;不能正确显示字符串"ShangHai"的语句是。

A) printf("%s",a+1);B) printf("%s",*(pa+1));

C) printf("%s",*a+1);D) printf("%s",&a[1][0]);

8. 已知:int a[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};

int (*ptr)[3]=a,*p=a[0];

则以下能够正确表示数组元素a[1][2]的表达式是。

A) *(*(a+1)+2) B) *(*(p+5)) C) (*ptr+1)+2 D) *((ptr+1)[2])

9. 已知:int a[ ]={1,2,3,4,5,6,7,8,9,10,11,12},*p=a;则值为3的表达式是。

A) p+=2,*(p++) B) p+=2,*++p C) p+=2,*p++ D) p+=2,++*p

10. 已知:int a[]={1,2,3,4}, y, *p=a;则执行语句y = (*++p)--;之后, 数组a各元素的值变为。

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

变量y的值是。

11. 已知:int a[ ]={1,3,5,7}, y *p= a;为使变量y的值为3,下列语句正确的是。

A) y=++*p++;B) y=++(*p++);C) y=(++*p)++;D) y=(*++p)++;

12. 已知:int x[ ]={ 1,3,5,7,9,11 },*ptr=x;则能够正确引用数组元素的语句是。

A) x B) *(ptr--) C) x[6] D) *(--ptr)

13. 函数的功能是交换变量x和y中的值,且通过正确调用返回交换的结果。能正确执行此功能的函数是。

A) funa (int *x, int *y) B) funb (int x, int y)

{ int *p;{ int t;

p=x;*x=*y;*y=*p;t=x;x=y;y=t;

} }

C) func (int *x, int *y) D) func (int *x, int *y)

{ *x=*y;*y=*x;{ *x=*x+*y;*y=*x-*y;*x=*x-*y;

} }

14. 有定义如下:

struct sk

{ int a;

float b;

}data ,*p;

如果p=&data;则对于结构变量data的成员a的正确引用是____。

A)(*).data.a B) (*p).a C) p->data.a D) p.data.a

15. 已知:

struct st

{ int n;

struct st *next;

};

static struct st a[3]={1,&a[1],3,&a[2],5,&a[0]},*p;

如果下述语句的显示是2,则对p的赋值是。

printf("%d",++(p->next->n));

A) p=&a[0];B) p=&a[1];C) p=&a[2];D) p=&a[3];

16. 已知:

struct person

{ char name[10];

int age;

}class[10]={"LiMing",29,"ZhangHong",21,"WangFang",22};

下述表达式中,值为72的一个是。

A) class[0]->age + class[1]->age+ class[2]->age

B) class[1].name[5]

C) person[1].name[5]

D) clase->name[5]

17. 已知:

struct

{ int i;

char c;

float a;

}test;

则sizeof(test)的值是。

A) 4 B) 5 C) 6 D) 7

18. 已知:

union

{ int i;

char c;

float a;

}test;

则sizeof(test)的值是。

A) 4 B) 5 C) 6 D) 7

19. 已知:

union u_type

{ int i;

char ch;

float a;

}temp;

现在执行"temp.i=266;printf("%d",temp.ch)"的结果是。

A) 266 B) 256 C) 10 D) 1

20. 若有以下程序段:

struct dent

{ int n;

int *m;

};

int a=1,b=2,c=3;

struct dent s[3] = { {101,&a},{102,&b},{103,&c} };

struct dent *p=s;

则以下表达式中值为2的是。

A) (p++)->m B) *(p++)->m C) (*p).m D) *(++p)->m

21. 若有以下说明语句,则对结构变量pup中sex域的正确引用是。

struct pupil

{ char name[20];

int sex;

}pup,*p;

p=&pup;

A) p.pup.sex B) p->pup.sex C) (*p).pup.sex D) (*p).sex

22. 以下对结构变量stul中成员age的非法引用是。

struct student

{ int age;

int num;

}stu1,*p;

p=&stu1;

A) stu1.age B) student.age C) p->age D) (*p).age

23. 若有以下定义和语句:

union data

{ int i;

char c;

float f;

}a;

int n;

则以下语句正确的是。

A) a=5;B) a={2,'a',1.2};C) printf("%d\n",a);D) n=a;

24. 已知:

struct sk

{ int a;

int age;

}date,*p;

如果要使指针p指向data中的成员a,正确的赋值语句是。

A) p = (struct sk *)&data.a;B) p = (struct sk *)data.a;

C) p = &data.a;D) *p = data.a;

25. 已知enum week {sun,mon,tue,wed,thu,fri,sat}day;则正确的赋值语句是。

A) sun=0;B) san=day;C) sun=mon;D) day=sun;

26. 已知enum color {red,yellow=2,blue,white,black}ren;执行下述语句的输出结果是。

printf("%d",ren=white);

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

27. 已知enum name{zhao=1,qian,sun,li}man;执行下述程序段后的输出是。

man=0;

switch(man)

{ case 0: printf("People\n");

case 1: printf("Man\n");

case 2: printf("Woman\n");

default: printf("Error\n");

}

A) People B) Man C) Woman D)Error

A) enem a={ one,two,three };B) enem a { one=9,two=-1,three };

C) enem a={"one","two","three"};D) enem a {"one","two","three"};

29. C语言中标准输入文件stdin是指。

A) 键盘B) 显示器C) 鼠标D) 硬盘

30. 要打开一个已存在的非空文件"file"用于修改,选择正确的语句。

A) fp=fopen("file", "r");B) fp=fopen("file", "a+");

C) fp=fopen("file", "w");D) fp=fopen('file", "r+");

31. 当顺利执行了文件关闭操作时,fclose函数的返回值是。

A) -1 B) TRUE C) 0 D) 1

32. fscanf函数的正确调用形式是。

A) fscanf (文件指针, 格式字符串, 输出列表);

B) fscanf (格式字符串, 输出列表, 文件指针);

C) fscanf (格式字符串, 文件指针, 输出列表);

D) fscanf (文件指针, 格式字符串, 输入列表);

33. 使用fgetc函数,则打开文件的方式必须是。

A) 只写B) 追加C) 读或读/写D) 参考答案B和C都正确

34. 已知宏定义

#define N 3

#define Y(n) ((N+1)*n)

执行语句z=2*(N+Y(5+1));后,变量z的值是。

A) 42 B) 48 C) 52 D) 出错

35. 已知宏定义#define SQ(x) x*x,执行语句printf("%d",10/SQ(3));后的输出结果是。

A) 1 B) 3 C) 9 D) 10

36. 下面程序的输出结果是。

void main()

{ int a[]={1,2,3,4,5,6};

int *p;

p=a;

printf("%d ",*p);

printf("%d ",*(++p));

printf("%d ",*++p);

printf("%d ",*(p--));

p+=3;

printf("%d %d ",*p,*(a+3));

}

A) 1 2 3 3 5 4 B) 1 2 3 4 5 6

C) 1 2 2 3 4 5 D) 1 2 3 4 4 5

37. 下面程序的输出结果是。

void main()

{ int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

int *p=a;

p+=6;

printf("%d ",*p);/* ① */

printf("%d ",*(*(a+6)));/* ② */

printf("%d ",*(a[1]+=2));/* ③ */

printf("%d",*(&a[0][0]+6));/* ④ */

}

A) 7 7 7 7 B) ②句语法错误C) ③句语法错误D) ④句语法错误

38. 下面程序的输出结果是。

#define FMT "%X\n"

#include

main( )

{ static int a[ ][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };

printf( FMT, a[2][2]);/* ① */

printf( FMT, *(*(a+1)+1) );/* ② */

}

① A) 9 B) 11 C) A D) B

② A) 6 B) 7 C) 8 D) 前面三个参考答案均是错误的

39. 下面程序的输出结果是。

#include

void main ( )

{ int a[]={1, 2, 3, 4, 5} ;

int x, y, *p;

p=&a[0];

x=*(p+2);

y=*(p+4);

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

}

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

40. 下面程序的输出结果是。

void ive(x,n)

int x[],n;

{ int t,*p;

p=x+n-1;

while(x

{ t=*x;

*x++=*p;

*p--=t;

}

}

void main()

{ int i,a[]={1,2,3,4,5,6,7,8,9,0};

ive(a,10);

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

printf("%d ",a[i]);

printf("\n");

}

A) 1 2 3 4 5 6 7 8 9 0 B) 0 9 8 7 6 5 4 3 2 1

C) 1 3 5 7 9 2 4 6 8 0 D) 0 8 6 4 2 9 7 5 3 1

41. 下面程序的输出结果是。

#include "string.h"

fun(char *w,int n)

{ char t,*s1,*s2;

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

while(s1

{ t=*s1++;

*s1=*s2--;

*s2=t;

}

}

void main()

{ static char *p="1234567";

fun(p,strlen(p));

printf("%s",p);

}

A) 7654321 B) 1717171 C) 7171717 D) 1711717

42. 下面程序的输出结果是。

#include

char *p = "abcdefghijklmnopq" ;

void main( )

{ int i=0;

while( *p++!='e' );

printf("%c\n", *p);

}

A) c B) d C) e D) f

43. 下面程序的输出结果是。

#include

f(int x, int y)

{ return (y-x);

}

{ int a=5, b=6, c;

int f(), (*g)()=f;

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

}

A) 1 B) 2 C) 3 D) 前面三个参考答案均是错误的

44. 下面程序的输出结果是。

#include

void main( )

{ int a=1,*p,**pp;

pp=&p;

p=&a;

a++;

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

}

A) 2,1,1 B) 2,1,2 C) 2,2,2 D) 程序有错误

45. 下面程序的输出结果是____。

void main()

{

char *alpha[7]={"ABCD","EFGH","IJKL","MNOP","QRST","UVWX","YZ"};

char **p;

int i;

p=alpha;

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

printf("%c",*(p[i]));

printf("\n");

}

A) AEIM B) BFJN C) ABCD D) DHLP

二、程序完善题

1. 下面程序的功能是实现数组元素中值的逆转。

#include

void main()

{ int i,n=10,a[10]={1,2,3,4,5,6,7,8,9,10};

invert(a,n-1);

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

printf("%4d",a[i]);

printf("\n");

}

void invert(int *s,int num)

{ int *t,k;

t=s+num;

while( ①)

*s=*t;

*t=k;

②;

③;

}

}

答案:①s

2. 下面函数的功能是将字符变量的值插入已经按ASCII码值从小到大排好序的字符串中。void fun(char *w, char x, int *n)

{ int i, p=0;

while(x>w[p])

①;

for(i=*n;i>=p;i--)

②;

w[p]=x;

++*n;

}

答案:①p++ ②w[i+1]=w[i]

3. 以下程序的功能是:读入一行字符(如:a、...y、z),按输入时的逆序建立一个链接式的结点序列,即先输入的位于链表尾(如下图),然后再按输入的相反顺序输出,并释放全部结点。

#include

void main( )

{ struct node

{ char info;

struct node *link;

} *top,*p;

char c;

top=NULL;

while((c= getchar( )) ①)

{ p=(struct node *)malloc(sizeof(struct node));

p->info=c;

p->link=top;

top=p;

}

while( top )

{ ②;

top=top->link;

putchar(p->info);

}

}

答案:①!= '\n' ②p=top

三、编程题

1. 编写函数,通过指针将一个字符串反向。

2. 编写一个函数insert(s1,s2,ch),实现在字符串s1中的指定字符ch位置处插入字符串s2。

3. 利用结构:struct complx

{ int real;

int im;

};

编写求两个复数之积的函数cmult,并利用该函数求下列复数之积:

⑴(3+4i)×(5+6i) ⑵(10+20i)×(30+40i)

4. 编写成绩排序程序。按学生的序号输入学生的成绩,按照分数由高到低的顺序输出学生的名次、该名次的分数、相同名次的人数和学号;同名次的学号输出在同一行中,一行最多输出10个学号。

指针习题

三、填空题 1. 下列函数change的功能是,将字符串中的小写字母转成大写字母,请填空。#include void change(char *a) //1 { int i=0; for(i=0;a[i]!=NULL;i++) //2 if(a[i]>='a'&&a[i]<='z') a[i]-=32; ; //3 } int main() { char p[80]; cout<<" \n"; cin.getline(p,80) ; //读一行字符,中间可以有空格 change(p); cout< void swap(int *p,int *q) { int temp; temp=*p; ; //1 ; //2 } int main() { int a,b; int *p1,*p2; cout<<"请输入两个正数:"; cin>>a>>b; p1=&a; p2=&b; swap(p1,p2);

cout<<"结果a和b的值:"< void sort( ) //1 { char ; //2 int i,j; for(i=0;i0 (4)p[j]=p[j+1] 4.函数find功能是:在指针p所指数组中,查找值为x的元素,找到后,返回该元素的下标,否则返回-1,改正程序中语句错误,能够正确运行。 #include #include const int N=10; int find(int *p,int n,int x) //1

C语言指针实验报告

C语言程序设计实验报告 1实验目的 (1)掌握指针的概念,会定义和使用指针变量; (2)能正确使用变量的指针和指向变量的指针变量; (3)能正确使用数组的指针和指向数组的指针变量; (4)能正确使用字符串的指针和指向字符串的指针变量; 2实验内容 将一个任意整数插入到已排序的整形数组中,插入后,数组中的数仍然保持有序;要求: (1)整形数组直接由赋值的方式初始化,要插入的整数有scanf()函数数入;(2)算法实现过程采用指针进行处理; (3)输入原始数据以及插入整数后的数据,并加以说明;

3算法描述流程图

4源程序 #include main() { int a[100],m,i,*p,n,w; printf("请输入要输入的数组的元素个数:\n"); scanf("%d",&n); printf("请输入已排好序的数组:\n"); for(i=0;i=w;i--) { a[i+1]=a[i]; } a[i+1]=m; for(i=0;i<=n;i++) { printf("%-4d",a[i]); } printf("\n"); } 5测试数据 “1,3,5,7,9,11,13,15,17,19······10” 6运行结果 7出现问题及解决方法 在编写过程中,

for(i=n-1;a[i]>=w;i--) { a[i+1]=a[i]; } a[i+1]=m; 这一步没有注意a[i++]=m和a[i+1]=m中i++和i+1不同,a[i++]=m是先将的值赋给a[i],然后在执行自增;而在实验过程中忽略了这一点,造成了不必要的麻烦; 8实验心得 通过这次指针实验掌握了指针的概念,会定义和使用指针变量,并且能利用指针来简单化一些问题,给以后的编程带来了很大的便利;

关于堆栈和指针(指针例子解释很好)

关于堆栈和指针 堆栈是一种执行“后进先出”算法的数据结构。 设想有一个直径不大、一端开口一端封闭的竹筒。有若干个写有编号的小球,小球的直径比竹筒的直径略小。现在把不同编号的小球放到竹筒里面,可以发现一种规律:先放进去的小球只能后拿出来,反之,后放进去的小球能够先拿出来。所以“先进后出”就是这种结构的特点。 堆栈就是这样一种数据结构。它是在内存中开辟一个存储区域,数据一个一个顺序地存入(也就是“压入——push”)这个区域之中。有一个地址指针总指向最后一个压入堆栈的数据所在的数据单元,存放这个地址指针的寄存器就叫做堆栈指示器。开始放入数据的单元叫做“栈底”。数据一个一个地存入,这个过程叫做“压栈”。在压栈的过程中,每有一个数据压入堆栈,就放在和前一个单元相连的后面一个单元中,堆栈指示器中的地址自动加1。读取这些数据时,按照堆栈指示器中的地址读取数据,堆栈指示器中的地址数自动减1。这个过程叫做“弹出pop”。如此就实现了后进先出的原则。 堆栈是计算机中最常用的一种数据结构,比如函数的调用在计算机中是用堆栈实现的。 堆栈可以用数组存储,也可以用以后会介绍的链表存储。 下面是一个堆栈的结构体定义,包括一个栈顶指针,一个数据项数组。栈顶指针最开始指向-1,然后存入数据时,栈顶指针加1,取出数据后,栈顶指针减1。 #define MAX_SIZE 100 typedef int DATA_TYPE; struct stack { DATA_TYPE data[MAX_SIZE]; int top; }; 堆栈是系统使用是临时存储区域。它是后进先出的数据结构。 C++主要将堆栈用于函数调用。当函数调用时,各种数据被推入堆栈顶部;函数终止后的返回地址、传递给函数的参数、函数返回的结果以及函数中声明的局部变量等等。因此当函数A调用函数B调用函数C,堆栈是增长了,但调用完成后,堆栈又缩小了。 堆是一种长期的存储区域。程序用C++的new操作符分配堆。对new的调用分配所需的内存并返回指向内存的指针。与堆栈不同,你必须通过调用new明确的分配堆内存。你也必须通过调用C++的delete 操作符明确的释放内存,堆不会自动释放内存。 如果C++中的一个类是定义在堆栈上的,就使用"."开访问它的成员。如果是定义在堆上的,就使用"->"指针来开访问。但在,"->"操作符也可以用在堆栈上的类。 什么是指针? 和其它变量一样,指针是基本的变量,所不同的是指针包含一个实际的数据,该数据代表一个可以找到实

《C++指针》习题参考答案

《C++指针》习题 学号姓名 一、选择题 1、有定义如下:int a[5], *p; 则下列描述错误的是B A.表达式p=p+1是合法的B.表达式a=a+1是合法的 C.表达式p-a是合法的D.表达式a+2是合法的 2、函数定义为Fun(int &i),变量定义n=100,则下面调用该函数正确的 是C A.Fun(20) B.Fun(20+n) C.Fun(n) D.Fun(&n) 3、若有说明int I,j=2,*p=&i;则能完成i=j赋值功能的语句是B A.i=*p; B.*p=*&j; C.i=&j; D.i=**p; 4、设已有定义char *st = "how are you";下列程序中正确的是A A.char a[11],*p;strcpy(p=a+1,&st[4]); B.char a[11];strcpy(++a,st); C. char a[11];strcpy(a,st); D. char a[],*p;strcpy(p=a[1],st+2); 5、设有数组int array[3][4],下列引用数组元素的方法中错误的是D A.array[i][j] B.*(*(array+i)+j) C. *(array[i]+j) D. *(array+i*4+j) 6、有定义int s[4][5],(*ps)[5];ps=s;则对数组s中元素引用的正确 的是C A.ps+1 B.*(ps+3) C. ps[0][2] D. *(ps+1)+3 7、设有说明int b[4][4],以下不能等价表示元素b[3][3]的是:B A.*&b[3][3] B.(*(*(b+3))+3) C.*(b[3]+3) D.*(*(b+3)+3) 8、若有说明"char *s[]={"234","5678","9012","3456","7890"};",则表达 式*s[1]> *s[3]比较的是B A."1234"和"9012" B.'5'和'3' C.'l'和'9' D."5678"和"3456" 9、设语句"char *s[]={"Student","Teacher","Father","Mother"},*ps=s[2];",执行语句"cout<<*s[1]<<','<

指针实验

实验名称:指针使用 实验目的:熟悉指针的正确用法。 相关知识:1.指针的定义;2.指针的引用; 实验内容: (1) 调试下面程序,指出错误原因。 main ( ) { int x=10,y=5,*px,*py; px=py; px=&x; py=&y; printf(“*px=%d,*py=%d”,*px,*py); } (2)调试下面程序。 #include main ( ) { float a; float *pa; scanf(“%f”,&a); printf(“1.%f\n”,a); pa=&a; scanf(“%f”,pa); printf(“2.%f\n”,a); } 在上述程序中,添加如下语句。 printf(“%x”,&a); printf(“%x”,pa); printf(“%x”,pa+1); ①记录这3条语句的输出值。其中“%x”表明输出的数值用十六进制数表示。 ②计算float类型所占空间的大小。 ③运算符sizeof可以计算出某一类型或变量所占存储空间的大小。请在上述程序中加入语句:printf(“%ld”,sizeof(float));将该语句的输出结果与步骤②的结果比较,观察是否一致。

(3)调试下面程序。 #include main ( ) { float a,b; float *pa=&a,*pb=&b; printf(“%x\n”,pa+pb); printf(“%x\n”,pa-pb); printf(“%x\n”,pa+5); printf(“%x\n”,pa-5); } 记录出错信息,分析出错原因。总结指针可以进行哪些运算。 下面的程序能获得上述运行结果吗? main( ) { char *s=”COMPUTER”; char c; printf(“which style you want to \n”); printf(“capital (c) or uncapital (u);”); c=getchar(); if (c=’c’) puts(s); else { s=”computer”; puts(s); } }

C语言中指针、数组和引用例子实例

一、指针:内容是指示一个内存地址的变量;类型是指示编译器怎么解释指针内容指向地址中的内容,以及该内存区域有多大; 例子: [cpp] int i = 0; int * pi = &i; printf(“pi = %x \n”, pi); // 打印pi的内容: 0x2000 printf(“*pi= %d \n” , *pi); // 打印pi指向地址中的值: 5 printf(“&pi= %x \n”, &pi); // 打印pi的地址: 0x100 从汇编的角度来看,指针是这样的: int i = 0; 010E139E mov dword ptr [i],0 int * pi = &i; 010E13A5 lea eax,[i] 010E13A8 mov dword ptr [pi],eax 二、数组:是一个单一数据类型对象的集合。其中单个对象没有被命名,通过索引访问。 数组名和指针的区别:数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组。数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量。指向数组的指针则是另外一种变量类型,仅仅意味着数组的存放地址 注意:虽然数组名可以转换为指向其指代实体的指针,但是它只能被看作一个指针常量,不能被修改,如下:天骄无双:https://www.wendangku.net/doc/453908015.html, [cpp] int intArray[10]; intArray++; // 错误 “指针和数组等价”说的是什么?索引操作相同,例如:p[2]; a[2]; 三、引用(reference)是一个对象的别名。用对象初始化引用后,对象的名字和引用都指向该对象; 引用是如何实现的?从汇编语言的角度来看,指针和引用是一样的: [cpp] int i = 0; 00E9139E mov dword ptr [i],0 int & ref = i; 00E913A5 lea eax,[i] 00E913A8 mov dword ptr [ref],eax int * pi = &i; 00E913AB lea eax,[i] 00E913AE mov dword ptr [pi],eax 指针和引用的区别(从C++使用角度来看): 不存在空引用 引用要初始化 引用初始化后,不能指向另一个对象 这是由编译阶段保证的。 备注:一个指向非常量的引用不能用字面值或者临时值初始化;但是一个指向常量的引用可以。天骄无双:https://www.wendangku.net/doc/453908015.html,

教材课后题答案-第6章_指针习题答案

习题解答 一、单项选择题 1.若定义了int n=2, *p=&n, *q=p;则下面【】的赋值是非法的。 A.p=q B. *p=*q C. n=*q D. p=n 【答案】D 2.若定义了double *p, a;则能通过scanf函数给输入项读入数据的程序段是【】。 A.p=&a; scanf(“%1e”,p); B. *p=&a; scanf(“%1f”,p); C. p=&a; scanf(“%f”,p); D. p=&a; scanf(“%1f”,a); 【答案】C 3.若定义了int a[10], i=3, *p; p=&a[5];下面不能表示为a数组元素的是【】。 A.p[-5] B. a[i+5] C. *p++ D. a[i-5] 【答案】D 4.若有如下定义: int n[5]={1,2,3,4,5},*p=n; 则值为5的表达式是【】。 A.*+5 B. *(p+5) C. *p+=4 D. p+4 【答案】C 5.设变量b的地址已赋给指针变量ps,下面为“真”的表达式是【】。 A.b==&ps B. b==ps C. b==*ps D. &b==&ps 【答案】C 6.设有以下定义和语句: int a[3][2]={1,2,3,4,5,6},*p[3]; p[0]=a[1]; 则*(p[0]+1)所代表的数组元素是【】。 A.a[0][1] B. a[1][0] C. a[1][1] D. a[1][2] 【答案】C 7.若定义了char *str=”Hello!”;下面程序段中正确的是【】。 A.char c[ ], *p=c; strcpy(p,str); B.char c[5], *p; strcpy(p=&c[1],&str[3]); C.char c[5]; strcpy(c,str); D.char c[5]; strcpy(p=c+2,str+3); 【答案】B 8.若有下面的程序段,则不正确的fxy函数的首部是【】。 main() { int a[20], n; … fxy(n, &a[10]); … } A.void fxy(int i, int j) B. void fxy(int x, int *y) C. void fxy(int m, int n[]) D. void fxy(int p, int q[10]) 【答案】A 9.不合法的带参数main函数的首部形式是【】。

指针练习题

. 编程题 1用指向数组的指针变量输出数组的全部元素 2 使用函数调用,形参为指针,实参为数组,把一个数组逆序存放在输出 练习题: 一判断题 1.指针是变量,它具有的值是某个变量或对象的地址值,它还具有一个地址值,这两个地址值是相等的。 2.指针的类型是它所指向的变量或对象的类型。 3.定义指针时不可以赋初值。 4.指针可以赋值,给指针赋值时一定要类型相同,级别一致。5.指针可以加上或减去一个int型数,也可以加上一个指针。6.两个指针在任何情况下相减都是有意义的。 7.数组元素可以用下标表示,也可以用指针表示。 8.指向数组元素的指针只可指向数组的首元素。 9.字符指针是指向字符串的指针,可以用字符串常量给字符指针赋值。 10.引用是一种变量,它也有值和地址值。 11.引用是某个变量的别名,引用是被绑定在被引用的变量上。

12.创建引用时要用一个同类型的变量进行初始化。 13.指针是变量,它可以有引用,而引用不能有引用。 ;. . 二单选题 1.下列关于定义一个指向double型变量的指针,正确的是()。A.int a(5);double *pd=a; B.double d(2.5),*pd=&d;C.double d(2.5),*pd=d; D.double a(2.5),pd=d;。).下列关于创建一个int型变量的引用,正确的是(2A.int a(3),&ra=a; B int . a(3),&ra=&a;ra=a;D.int a(3), C.double d(3.1);int &rd=d;.下列关于指针概念的描述中,错误的是()。3 A.指针中存放的 是某变量或对象的地址值.指针的类型是它所存放的数值的类型 B .指针是变量,它也具有一个内存地址值 C .指针的值是可以改 变的D 。.下列关于引用概念的描述中,错误的是()4 A.引 用是变量,它具有值和地址值 B.引用不可以作数组元素 C.引用是变量的别名 D.创建引用时必须进行初始化。++*p相同的是()*p=a5.已知:int a[5],;则与a[0] . B.*++p A++a[0] .C*p++ D.;. . 6.已知:int a[ ]={1,2,3,4,5},*p=a;在下列数组元素地址的表

C语言指针实验报告

C语言程序设计实验报告 1实验目得 (1)掌握指针得概念,会定义与使用指针变量; (2)能正确使用变量得指针与指向变量得指针变量; (3)能正确使用数组得指针与指向数组得指针变量; (4)能正确使用字符串得指针与指向字符串得指针变量; 2实验内容 将一个任意整数插入到已排序得整形数组中,插入后,数组中得数仍然保持有序; 要求: (1)整形数组直接由赋值得方式初始化,要插入得整数有scanf()函数数入; (2)算法实现过程采用指针进行处理; (3)输入原始数据以及插入整数后得数据,并加以说明;

3算法描述流程图

4源程序 #include main() { int a[100],m,i,*p,n,w; printf("请输入要输入得数组得元素个数:\n"); scanf("%d",&n); printf("请输入已排好序得数组:\n"); for(i=0;i=w;i--) { a[i+1]=a[i]; } a[i+1]=m; for(i=0;i<=n;i++) { printf("%-4d",a[i]); } printf("\n"); } 5测试数据 “1,3,5,7,9,11,13,15,17,19······10” 6运行结果 7出现问题及解决方法 在编写过程中,

for(i=n-1;a[i]>=w;i--) { a[i+1]=a[i]; } a[i+1]=m; 这一步没有注意a[i++]=m与a[i+1]=m中i++与i+1不同,a[i++]=m就是先将得值赋给a[i],然后在执行自增;而在实验过程中忽略了这一点,造成了不必要得麻烦; 8实验心得 通过这次指针实验掌握了指针得概念,会定义与使用指针变量,并且能利用指针来简单化一些问题,给以后得编程带来了很大得便利;

指针综合练习题(带答案)

指针综合练习题 一、选择题 1.若有以下定义,则对a数组元素的正确引用是____d_____. int a[5],*p=a; a)*&a[5] b)a+2 c)*(p+5) d)*(a+2) 2.若有定义:int a[2][3],则对a数组的第i行j列元素地址的正确引用为__d____. a)*(a[i]+j) b)(a+i) c)*(a+j) d)a[i]+j 3.若有以下定义,则p+5表示___a____. int a[10],*p=a; a)元素a[5]的地址b)元素a[5]的值 c)元素a[6]的地址d)元素a[6]的值 4.设p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确 执行的赋值语句是____b____. a)c=*p1+*p2; b)p2=c c)p1=p2 d)c=*p1*(*p2); 5.若有说明语句 char a[]="It is mine"; char *p="It is mine"; 则以下不正确的叙述是___d_____. a)a+1表示的是字符t的地址 b)p指向另外的字符串时,字符串的长度不受限制 c)p变量中存放的地址值可以改变 d)a中只能存放10个字符 二、填空题 1 指针变量保存了另一变量的(1)值,不可以任意给指针变量赋一个地址值,只能赋给 它(2)和(3)的地址。使用变量名来访问变量,是按(4)来直接存取变量称为(5)方式;而借助指针变量取得另一变量的地址,访问该变量称为(6)方式。 答案:(1)地址 (2)NULL (3)已经分配了内存的变量的地址 (4)按变量的地址 (5)直接访问 (6)间接访问 2 以下程序的功能是:通过指针操作,找出三个整数中的最小值并输出。 请填空。 void main() {int *a,*b,*c,num,x,y,z; a=&x;b=&y;c=&z; cou<<"输入3个整数:"; cin>>a>>b>>c; cout<<*a<<*b<<*c; num=*a;

c语言指针习题及答案54902

指针习题及答案 一.选择题 1.变量的指针,其含义是指该变量的 B 。 A)值B)地址C)名D)一个标志 2.已有定义int k=2;int *ptr1,*ptr2;且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值语句是 B 。 A)k=*ptr1+*ptr2 B)ptr2=k C)ptr1=ptr2 D)k=*ptr1*(*ptr2) 3.若有说明:int *p,m=5,n;以下程序段正确的是 D 。 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 a=25;print_value(&a);下面函数的输出结果是 D 。 void print_value(int *x) { printf(“%d\n”,++*x); } A)23 B)24 C)25 D)26 5.若有说明:int *p1, *p2,m=5,n;以下均是正确赋值语句的选项是 C 。 A)p1=&m; p2=&p1 ; B)p1=&m; p2=&n; *p1=*p2 ; C)p1=&m; p2=p1 ; D)p1=&m; *p1=*p2 ; 6.若有语句:int *p,a=4;和p=&a;下面均代表地址的一组选项是 D 。 A)a,p,*&a B)&*a,&a,*p C)*&p,*p,&a D)&a,&*p,p 7.下面判断正确的是 C 。 A)char *a=”china”; 等价于char *a; *a=”china” ; B)char str[10]={“china”}; 等价于char str[10]; str[ ]={“china”;} C)char *s=”china”; 等价于char *s; s=”china” ; D)char c[4]=”abc”,d[4]=”abc”; 等价于char c[4]=d[4]=”abc” ; 8.下面程序段中,for循环的执行次数是 C 。 char *s=”\ta\018bc” ; for ( ; *s!=’\0’ ; s++) printf(“*”) ; A)9 B)7 C)6 D)5 9.下面能正确进行字符串赋值操作的是 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) ; 10.下面程序段的运行结果是 C 。 char *s=”abcde” ; s+=2 ; printf(“%d”,s); A)cde B)字符’c’C)字符’c’的地址D)不确定 11.设p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确执行的赋值语句是 B 。 A)c=*p1+*p2 B)p2=c C)p1=p2 D)c=*p1*(*p2) 12.设有程序段:char s[ ]=”china”; char *p ; p=s ;则下面叙述正确的是 D 。A)s和p完全相同 B)数组s中的内容和指针变量p中的内容相等

c语言指针实验报告

C语言实习报告 题目:指针及其应用 系别: 专业: 姓名: 学号: 日期:

一实验名称:指针及其应用 二实验目的: (1)掌握变量的指针及其基本用法。 (2)掌握一维数组的指针及其基本用法。 (3)掌握指针变量作为函数的参数时,参数的传递过程及其用法。 三实验内容: (1)运行以下程序,并从中了解变量的指针和指针变量的概念。 (2)运行以下程序,观察&a[0]、&a[i]和p的变化,然后回答以下问题: 1.程序的功能是什么? 2.在开始进入循环体之前,p指向谁? 3.循环每增加一次,p的值(地址)增加多少?它指向谁? 4.退出循环后,p指向谁? 5.你是否初步掌握了通过指针变量引用数组元素的方法? (3)先分析以下程序的运行结果,然后上机验证,并通过此例掌握通过指针变量引用数组元素的各种方法。

(4)编写函数,将n个数按原来的顺序的逆序排列(要求用指针实现),然后编写主函数完成: ①输入10个数; ②调用此函数进行重排; ③输出重排后的结果。 四分析与讨论: (1)指针的定义方法,指针和变量的关系。 定义方法: 数据类型 *指针变量名; 如定义一个指向int型变量的指针—— int *p;

则我们可以继续写如下代码—— int a = 4; p = &a; printf("%d", *p); 在这里,我们定义了一个变量a,我们把它理解为内存空间连续的4个字节(int型占用4字节),则这4个字节的空间保存着一个数4。&是取地址符号,即把变量a的地址(即这4个字节的首地址)赋给指针p (记住指针p的类型和变量a的类型要保持一致,否则的话,要进行类型转换)。这样子,指针p就保存着变量a的地址。我们如果把指针p当做内存空间里面另外一个连续的4个字节,那么这4个字节保存的数就是变量a的地址。printf("%d",*p)和printf("%d",a)的结果是一样的。这里的*是取变量符号(与&刚好作用相反,通过变量的地址找到变量),与定义时int *p的*号作用不同(定义时的*表示该变量是个 指针变量,而非是取它指向的变量)。 (2)数组和指针的关系。 指针与数组是C语言中很重要的两个概念,它们之间有着密切的关系,利用这种关系,可以增强处理数组的灵活性,加快运行速度,本文着重讨论指针与数组之间的联系及在编程中的应用。 1.指针与数组的关系 当一个指针变量被初始化成数组名时,就说该指针变量指向了数组。如: char str[20], *ptr; ptr=str; ptr被置为数组str的第一个元素的地址,因为数组名就是该数组的首地址,也是数组第一个元素的地址。此时可以认为指针ptr就是数组str(反之不成立),这样原来对数组的处理都可以用指针来实现。如对数组元素的访问,既可以用下标变量访问,也可以用指针访问。 2.指向数组元素的指针 若有如下定义: int a[10], *pa; pa=a; 则p=&a[0]是将数组第1个元素的地址赋给了指针变量p。 实际上,C语言中数组名就是数组的首地址,所以第一个元素的地址可以用两种方法获得:p=&a[0]或p=a。 这两种方法在形式上相像,其区别在于:pa是指针变量,a是数组名。值得注意的是:pa是一个可以变化的指针变量,而a是一个常数。因为数组一经被说明,数组的地址也就是固定的,因此a是不能变化的,不允许使用a++、++a或语句a+=10,而pa++、++pa、pa+=10则是正确的。由此可见,此时指针与数组融为一体。 3.指针与一维数组 理解指针与一维数组的关系,首先要了解在编译系统中,一维数组的存储组织形式和对数组元素的访问方法。 一维数组是一个线形表,它被存放在一片连续的内存单元中。C语言对数组的访问是通过数组名(数组的起始地址)加上相对于起始地址的相对量(由下标变量给出),得到要访问的数组元素的单元地址,然后再对计算出的单元地址的内容进行访问。通常把数据类型所占单元的字节个数称为扩大因子。 实际上编译系统将数组元素的形式a[i]转换成*(a+i),然后才进行运算。对于一般数组元素的形式:<数组名>[<下标表达式>],编译程序将其转换成:*(<数组名>+<下标表达式>),其中下标表达式为:下标表达式*扩大因子。整个式子计算结果是一个内存地址,最后的结果为:*<地址>=<地址所对应单元的地址的内容>。由此可见,C语言对数组的处理,实际上是转换成指针地址的运算。 数组与指针暗中结合在一起。因此,任何能由下标完成的操作,都可以用指针来实现,一个不带下标的数组名就是一个指向该数组的指针。

C语言数组指针的小例子

1、功能:输入6个学生的5门课程成绩,计算出每个学生的平均分和每门课程的平均分。 2、C语言实现代码:(其实就是用二维数组来实现的,二维数组的引用传递使用数组指针来完成) 复制代码代码如下: #include <stdio.h> #define STUDENT 5 #define SCORE 6 void input_array(float (*score)[STUDENT]); void avg_score(float (*score)[STUDENT]); void avg_course(float (*score)[STUDENT]); /** * calculate student average score and course average socore. */ int main(){ float a[SCORE][STUDENT]; input_array(a); avg_course(a); avg_score(a); } void input_array(float (*score)[STUDENT]){ int i, j; for(i=0; i<SCORE; i++){ printf("input the %d student score:", i+1); for(j=0; j<STUDENT; j++){ scanf("%f", score[i] + j); } } } void avg_course(float (*score)[STUDENT]){ int i,j; float s; for(j=0; j<STUDENT; j++){ printf("course%d ", j); } printf("n"); for(i=0; i<SCORE; i++){ s=0; for(j=0; j<STUDENT; j++){ printf("%f ", *(score[i] + j)); s += *(score[i] + j); }

指针练习题与答案

编程题 1用指向数组的指针变量输出数组的全部元素 #include void main( ) { int a[10], i; int *p; for (i=0; i<10; i++) cin>>a[i]; for (p=a; p void main( ) { int a[10], i; int *p=a; for (i=0; i<10; i++) cin>>a[i]; for (i=0; i<10; i++) cout<<*p++<<‘\t’; } 2 使用函数调用,形参为指针,实参为数组,把一个数组逆序存放在输出

#include void inv(int *x, int n); void main( ) { int i, a[10]={3,7,9,11,0,6,7,5,4,2}; inv(a,10); for (i=0;i<10; i++) cout<

【实验指导书】实验7:指针 (1)

(2014~2015学年-第1学期) 1. 理解指针、地址和数组间的关系。 2. 掌握通过指针操作数组元素的方法; 3. 掌握数组名作为函数参数的编程方式。 4. 掌握通过指针操作字符串的方法。 5. 了解掌握使用断点调试程序的方法。 二、实验环境: 操作系统:Window 8 编译环境:CodeBlock 13.02 三、实验要求及内容(根据实验要求,将整个实验过程需要的数据和截屏记录于此,并整理成实验步骤。): 1.设计一个程序计算输入的两个数的和与差,要求自定义一个函数sum_diff(float op1,float op2,float *psum,float *pdiff),其中op1和op2是输入的两个数,*psum和*pdiff是计算得出的和与差。 解: (1)流程图如图1所示: 图1 程序7-1的流程图

图2 实验7-1实验源代码 (3)运行结果(测试用例) 实验7-1运行结果如图3所示 图3 实验7-1运行结果 2. 输入n 个正整数,使用选择法将它们从小到大排序后输出。要求:利用所学指针的内容实现。 提示:在指针这一章所学的冒泡排序算法基础上改写。 解: (1)流程图如图1所示: 图1 程序7-2的流程图

图2 实验7-2实验源代码(3)运行结果(测试用例)实验7-2运行结果如图3所示 图3 实验7-2运行结果

3. 输入10个整数存入数组a ,再输入一个整数x ,在数组a 中查找x ,若找到则输出相应的下标,否则显示“Not found ”。要求定义和调用函数seach(int list[],int n ,int x),在数组list 中查找元素x ,若找到则返回相应的下标,否则返回-1,参数n 代表数组list 中元素的数量。试编写相应程序。 解:(1)流程图如图1 7-3的流程图 (2)源代码 源代码如图2所示

c语言指针GetMemory经典例子

GetMemory的典型例子 2010-01-13 18:24 520人阅读评论(2) 收藏举报//NO.1:程序首先申请一个char类型的指针str,并把str指向NULL(即str里存的是NULL的地址,*str为NULL中的值为0),调用函数的过程中做了如下动作:1申请一个char 类型的指针p,2把str的内容copy到了p里(这是参数传递过程中系统所做的),3为p指针申请了100个空间,4返回Test函数.最后程序把字符串hello world拷贝到str 指向的内存空间里.到这里错误出现了!str的空间始终为NULL而并没有实际的空间.深刻理解函数调用的第2步,将不难发现问题所在! void GetMemory(char *p) { p = (char*)malloc(100); } void Test(void) { char *str = NULL; GetMemory(str); strcpy(str, "hello world"); printf(str); } //请问运行Test函数后会是什么样的结果? //NO.2:程序首先申请一个char类型的指针str,并把str指向NULL.调用函数的过程中做了如下动作:1申请一数组p[]并将其赋值为hello world(数组的空间大小为12),2返回数组名p付给str指针(即返回了数组的首地址).那么这样就可以打印出字符串"hello world"了么?当然是不能的!因为在函数调用的时候漏掉了最后一步.也就是在第2步return数组名后,函数调用还要进行一步操作,也就是释放内存空间.当一个函数被调用结束后它会释放掉它里面所有的变量所占用的空间.所以数组空间被释放掉了,也就是说str所指向的内容将不确定是什么东西. char *GetMemory(void) { char p[] = "hello world"; return p;

c语言指针的习题答案

指针练习题 1.有以下程序 main() { char a[]="programming",b[]="language"; char *p1,*p2; int i; p1=a;p2=b; for(i=0;i<7;i++) if(*(p1+i)==*(p2+i)) printf("%c",*(p1+i)); } 输出结果是 A)gm B)rg C)or D)ga 2.设有说明int(*ptr)[m];其中的标识符ptr是 A)M个指向整型变量的指针 B)指向M个整型变量的函数指针 C)一个指向具有M个整型元素的一维数组的指针 D)具有M个指针元素的一维指针数组,每个元素都只能指向整型量 3.若已定义:int a[9],*p=a;并在以后的语句中未改变p的值,不能表示a[1] 地址的表达式是 A) p+1 B) a+1 C) a++ D) ++p 4.若有语句int *point ,a=4;和point =&a;下面均代表地址的一组选项是 A. a,point,*&a B. &*a,&a,*point C. &point,*point,&a D. &a,&*point,point 5.下面程序段的运行结果是 char a[]=”language”,*p;p=a; while(*p!=’u’) {printf(“%c”, *p-32);p++;} A. LANGUAGE B. LANGuage https://www.wendangku.net/doc/453908015.html,NG https://www.wendangku.net/doc/453908015.html,ngUAGE 6.以下程序的运算结果是*p=1,m=3,n=5 。 #include void main() {

int a[5]={1,2,3,-4,5}; int m,n,*p; p=&a[0]; m=*(p+2); n=*(p+4); printf("*p=%d,m=%d,n=%d",*p,m,n); } 7.写一通用函数slength,求出一个字符串的长度,并用main函数调用slength。解: #include #include int slength(char str[]) { int i; for(i=0;str[i]!='\0';i++); return i; } void main() { char string[50]; int len; printf("请输入字符串:"); gets(string); len=slength(string); printf("字符串长度是%d",len); } 8.若有定义:int a[2][3],则对a数组的第i行j列元素地址的正确引用为______. A)*(a[i]+j) B)(a+i) C)*(a+j) D)a[i]+j 9.若有以下定义,则p+5表示_______. int a[10],*p=a; a)元素a[5]的地址b)元素a[5]的值 c)元素a[6]的地址d)元素a[6]的值 8.下面程序的运行结果是_______. #include #include main()

相关文档