文档库 最新最全的文档下载
当前位置:文档库 › 函数与指针选择题.docx

函数与指针选择题.docx

函数与指针选择题.docx
函数与指针选择题.docx

函数与指针练习

1、以下叙述屮正确的是

A)函数名允许用数字开头

B)函数调用时,不必区分函数名称的大小写

0调用函数时,函数名必须与被调用的函数名完全一致

D)在函数体中只能出现一次return语句

2、函数调用语句:fun( (expl, exp2), ( expl, exp2, cxp3)); 含有的实参个数是

A) 2 B) 4 0 5 D) 1

3、有以下程序

★include

main()

{ int findmax(int, int, int), m;

I

I

m=f indmax (a, b, c);

int k=5; void f (int *s)

{ *s=k; }

mainO

{ int m=3, *p=&m;

f(p);

printf (z,%d, m, *p);

}

程序的运行结果是

A)5,5 B) 3,3 C) 3,5 D) 5,3

7、以下关于C语言函数参数传递方式的叙述正确的是

A)数据只能从实参单向传递给形参

B)数据可以在实参和形参之间双向传递

0 数据只能从形参单向传递给实参

D) C语言的函数参数既可以从实参单向传递给形参,也可以在实参和形参之间双向传递,可视情况选择使用

8、有以下程序

int findmax(int x,int y, int z)

{ … }

则以下叙述正确的是

A)在maini^i数中声明了findmax函数

B)在mdin函数屮定义了 f indmax函数

C)在main函数中两次调川了findmax函数

D)在main函数内.外重复定义了findmax函数

4、以下叙述中正确的是

A)用户自己定义的函数只能调用库函数

B)实用的C语言源程序总是由一个或多个函数组成

0不同函数的形式参数不能使用相同名称的标识符

[))在C语言的函数内部,可以定义局部嵌套函数

5、以下程序中函数f的功能是:当flag为1时,进行由小到大排序;当flag为0时,进行由大到小排序。

#inelude

void f(int b[], int n, int flag)

{

int i,j,t;

for (i=0; i

for (j=i+l; jvn; j++)

if(flag?b[i]>b[j]:b[i]

{ t=b[i]; b[i]=b[j]; b[j]=t; }

}

main()

{

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

f(&a[2], 5, 0);

f(a, 5,1);

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

printf(”%d,“, a[i]);

}

程序运行后的输出结果是

A)1,2,3,4,5,6,7,8,9,10,

B)3,4,5,6,7,21,8,9,10,

0 5,4,3,2,1,6,7,8,9,10,

D) 10,9,8,7,6,5,4,3,2,1,

6、有以下程序^include

#include

void fun( int x, int y, int *z ) { *z = y-x; }

main()

int a, b, c;

fun (10, 5, &a ) ; fun (7, a, &b ); fun (a, b, &c );

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

}

程序运行后的输出结果是

A)-5,-12, -7 B) 5,2,3

0 -5,-12,-17 D) 5, -2, -7

9、有以下程序:

#include void fun( int a, int b)

{ int t;

t=a; a=b; b=t;

)

main()

{ int c[10] = { 1234567,890}, i;

for (i=0; i<10;

for(i=0; i<10;

)

程序的运行结果是(

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

0 0,9,&7,6,5,4,3,2,l,

10、有以下程序

#include void fun( int *a,int *b)

{int *c; c=a;a=b;b=c;

}

main()

{int x=3, y=5, *p=&x, *q=&y; fun(p,q);

printf, %d,%d,”,*p,*q); fun(&x,&y);

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

}

程序运行后的输岀结果是

i+=2) fun(c[i], c[i+l]); i++)

printf(H%d, ”,c[i]);

)。

B) 2,1,4,3,6,5,&7,0,9,

D) 0,1,2,3,4,567,8,9,

A) 3,53,5 B) 3,5,5,3 0 5,33,5 D) 5,3,5,3

11、有以下程序

#include

void fun( int a, int b, int c )

{ a=b; b=c; c=a; }

main()

{ int a=10, b=20, c=30;

fun( a, b, c ); printf(”%d,%d,%d\n”,c,b,a);

}

程序运行后的输出结果是

A) 10,20,30 B) 30,20,10 0 20,30,10 D) 0,0,0

12、有以下程序

#include

void fun( int x, int y, int *c, int *d )

{ *c = x+y; *d = x-y; }

main()

{ int a=4, b=3, c=0, d=0;

fun ( a, b, &c, &d );

printf( "%d %d\n", c, d );

}

程序的输出结果是

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

13、有以下程序

#include

void fun( int *p, int *q )

{ int t;

t = *p; *p = *q; *q=t;

*q = *p;

}

main()

{ int a=0, b=9;

fun ( &a, &b );

printff "%d %d\n", a,b );

}

程序的输出结果是

A) 9 0 B) 0 0 0 9 9 D) 0 9

14、若有以下函数首部

int fun(double x[10]z int *n)

则下面针对此函数的函数声明语句中正确的是

A) int fun(double , int);

B) int fun(double *, int *);

C) int fun (double *x, int n);

D) int fun (double x, int *n);

15、有以下程序

itincludo

void fun( int *s, int t, int *k )

{ int p;

for( p=0, *k=p; p

if( s[p]>s[*k] ) *k = p;

}

main()

{

int a[10] = { 11, 12, 13, 14, 15, 16, 20, 1 & 19, 10 },k ; fun( a, 10, &k );

printf (,z%d, %d\n,z, k, a[k]);

}

程序运行后的输出结果是

A) 6,20 B) 10,9 C) 7,20 D) 10, 10

16、在一个C源程序文件中所定义的全局变量,其作用域为()0

A) 由具体定义位置和extern说明来决定范围

B) 所在程序的全部范围

O所在函数的全部范围

D)所在文件的全部范围

17、有以下程序

#inelude

int d=l;

void fun( int p)

{

int d=5;

d += p++;

printf("%d “, d );

}

main()

{

int a=3;

fun( a );

d += a++;

printf(“%d\n“,d);

}

程序的输岀结果是

A) 8 4 B) 9 6 0 9 4 D) 8 5

18、有以下程序

#include

int a=l, b=2;

void funl( int a, int b )

{ printf( ”%d %d “ b ); }

void fun2()

{ a=3; b=4; }

main()

{ funl(5,6); fun2(); printff "%d %d\n",a, b );

}

程序运行后的输出结果是

A) 5612 B) 3456 0 1256 D) 5 634

19、有以下程序

#include

int b=2;

int fun(int *k)

{ b=*k+b; return (b);}

main()

{ inta[10]={l,2,3,4,5,6,7,8},i;

for(i=2;i<4;i++) {b二fun(&a[i])+b; printf("%d ",b);}

printf(”\n”);

}

程序运行后的输出结果是

A) 8 10 B) 10 28 C) 10 12 D) 10 16

20、有以下程序

#include

int fun(intA)

{

int b=0;

static int c=3;

a =( c++,b++);

return ( a );

}

main()

{

int a = 2, i, k;

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

k = fun( a++);

printf( “%d\n”,k);

}

程序的输出结果是

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

21、以下关于地址和指针的叙述中正确的是

A) 可以収变量的地址赋值给同类型的指针变量

B) 可以取常量的地址赋值给同类型的指针变量

0可以取一个指针变最的地址赋给本指针变量,这样就使得指针变量指向自身

D)所有指针变量如果未赋初值,则自动赋空值NUI丄

22、以下关于指针的叙述正确是

A) 所有类型的指针变量所占内存的大小是-?样的

B) 指钊?变量所占内存的大小与其类型有关,char型指针变量只占1个字节,double型指针变量占8个字节

0指针变量可直接指向任何类型的变量,而不会出现编译或运行错误

D)指针变量既可以直接指向结构体,也可直接指向结构体屮某个成员,而不会出现编译或运行错误

23、以下定义语句中正确的是

A) int a=b=0; B) char A=65+l,b='b';

C) float a=l,*b=&a,*c=&b;

D) double a=0.0; b=l.l;

24设已有定义:float x;,则以下对指针变filp进行定义且赋初值的语句中正确的是()。

A) int *p=(float)x;B) float *p=&x;

C) float p=&x;D) float *p=1024;

25、若有定义语句:double x, y, *px, *py;执行了px = &x;py=&y;之后,正确的输入语句是()o

A)scanf(”%lf %le", px, py);

B)scanf("%f %f' &x, &y);

0 scanf(H%f%r, x, y);

D) scanf(M%lf%ir, x, y);

26、有以下程序

#include

void f( int *q )

{int i=0;

for ( ;i<5; i++) (*q)++;

}

main()

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

f(a);

for (i=0;i<5; i++) printf("%d/'z a[i]); }

程序运行后的输岀结果是

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

0 1, 2Z 3, 4, 5, D) 2, 3, 4, 5, 6,

27、有以下程序

#inelude main()

{

char ch[ ] ="uvwxyz"/*pc;

pc=ch; printf(”%c\n”, *(pc+5));

}

程序运行后的输出结果是

A) z B) 0

C)元素ch⑸的地址D)字符y

的地址

28、若有以下程序段

char str[4][12]

{"aaa", "bbbb", "ccccc", "dddddd"}, *str讥4];

int i;

for( i=0; i<4; i++) strp[i]=str[i]; 则以下错误引

用字符出的选项是(英中0Wk<4) A) strp B) str[k] C) strp[k]

D) *strp

29、有以下程序:

# include

void fun( int a[J, int n)

{ int i, t;

for(i=0; i

a[n— 1 —1J; a[n— 1 —i]=t;}

}

main()

{ int kllOJ =

{ 1,2,3,4,5,6,7,8,9,10}, i; fun(k,5);

for(i = 2;i<8;

printf(n\n n);

}

程序的运行结果是( A) 321678 B) 876543

28、有以下程序

#include

#include void fun(int *pljnt *p2,int

*s )

{ s=( int * )malloc( sizeof(int));

*s = *pl + *(p2++);

}

main()

{ int a[2]={l,2 }, b[2]={10,20}, *s=a; fun( a,b z s );

printf("%d\n", *s );

}

a[i] =

i++)printf(M%d H, k[i]);

)o

0 1098765 D) 345678

程序运行后的输出结果是

A) 11 B) 10 C) 1 D) 2

29、有以下程序

#inelude int fun( char s[])

char *p = s;

while( *p != 0 ) p++;

return ( p-s);

}

main()

{

printf("%d\n", fun("OABCDEF"));

}

程序运行后的输出结果是

A) 1 B) 6 C) 7 D) 0

30、有以下程序

#include

#include

void fun ( char *s )

{

char a[10);

strcpy( a, "STRING");

s = a;

}

main()

{

char f PROGRAM”;

fun( p );

printf(“%s\n”,p);

}

程序运行后的输岀结果是(此处□代表空格) A) STRING B) STRING□□口口

C) STRING□□口D) PROGRAM

31、以下选项中正确的语句组是

A) char *s; s二{“BOOK!"};

B) char *s; s-'BOOK!”;

C) char s[10]; s="BOOK!H;

D) char s[]; s 二” BOOK!”;

函数指针

方法 指针函数和函数指针的区别 关于函数指针数组的定义 为函数指针数组赋值 函数指针的声明方法为: 数据类型标志符 (指针变量名) (形参列表); 注1:“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如: int func(int x); /* 声明一个函数 */ int (*f) (int x); /* 声明一个函数指针 */ f=func; /* 将func函数的首地址赋给指针f */ 赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。 注2:函数括号中的形参可有可无,视情况而定。 下面的程序说明了函数指针调用函数的方法: 例一、 #include int max(int x,int y){ return(x>y?x:y); } void main() { int (*ptr)(int, int); int a,b,c; ptr=max; scanf("%d%d",&a,&b); c=(*ptr)(a,b); printf("a=%d,b=%d,max=%d",a,b,c); } ptr是指向函数的指针变量,所以可把函数max()赋给ptr作为ptr的值,即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数,实际上ptr 和max都指向同一个入口地址,不同就是ptr是一个指针变量,不像函数名称那样是死的,它可以指向任何函数,就看你想怎么做了。在程序中把哪个

C指针函数习题

C++指针函数习题 一、选择题 1.以下程序的运行结果是()。 sub(int x, int y, int *z) { *z=y-x; } void main() { int a,b; sub(10,5,&a); sub(7,a,&b); cout< #include<>

函数及指针练习题

函数练习题 【1.54】对函数形参的说明有错误的是____。 A) int a(float x[],int n) B) int a(float *x,int n) C) int a(float x[10],int n) D) int a(float x,int n) 【1.55】如果一个变量在整个程序运行期间都存在,但是仅在说明它的函数内是可见的,这个变量的存储类型应该被说明为____。 A)静态变量B) 动态变量C) 外部变量D) 内部变量 【1.56】在一个C源程序文件中,?若要定义一个只允许在该源文件中所有函数使用的变量,则该变量需要使用的存储类别是。 A) extern B) register C) auto D) static 【1.57】在C语言中,函数的数据类型是指____。 A)函数返回值的数据类型B) 函数形参的数据类型 C) 调用该函数时的实参的数据类型D) 任意指定的数据类型 【1.58】已知如下定义的函数: fun1(a) { printf("\n%d",a); } 则该函数的数据类型是____。 A)与参数a的类型相同B) void型 C) 没有返回值D) 无法确定 【1.59】定义一个函数实现交换x和y的值,并将结果正确返回。能够实现此功能的是____。 A) swapa(int x,int y) B) swapb(int *x,int *y) { int temp;{ int temp; temp=x;x=y;y=temp;temp=x;x=y;y=temp; } } C) swapc(int *x,int *y) D) swapd(int *x,int *y) { int temp;{ int *temp; temp=*x;*x=*y;*y=temp;temp=x;x=y;y=temp; } } 【1.60】求一个角的正弦函数值的平方。能够实现此功能的函数是____。 A) sqofsina(x) float x; { return(sin(x)*sin(x)); } B) double sqofsinb(x) float x; { return(sin((double)x)*sin((double)x)); } C) double sqofsinc(x) { return(((sin(x)*sin(x)); } D) sqofsind(x) float x;

指向函数的指针详解

指向函数的指针 函数指针是指指向函数而非指向对象的指针。像其他指针一样,函数指针也指向某个特定的类型。函数类型由其返回类型以及形参表确定,而与函数名无关: bool (*pf)(const string &,const string &); 这个语句将pf声明为指向函数的指针,它所指向的函数带有两个const string &类型的形参和bool 类型的返回值。 注意:*pf两侧的括号是必需的。 1.typedef简化函数指针的定义: 函数指针类型相当地冗长。使用typedef为指针类型定义同义词,可将函数指针的使用大大简化: Typedef bool (*cmpfn)(const string &,const string &); 该定义表示cmpfn是一种指向函数的指针类型的名字。该指针类型为“指向返回bool类型并带有两个const string 引用形参的函数的指针”。在要使用这种函数指针类型时,只需直接使用cmpfcn即可,不必每次都把整个类型声明全部写出来。 2.指向函数的指针的初始化和赋值 在引用函数名但又没有调用该函数时,函数名将被自动解释为指向函数的指针。假设有函数: Bool lengthcompare(const string &,const string &); 除了用作函数调用的左操作数以外,对lengthcompare的任何使用都被解释为如下类型的指针:

bool (*)(const string &,const string &); 可使用函数名对函数指针初始化或赋值: cmpfn pf1=0; cmpfn pf2=lengthcompare; pf1=legnthcompare; pf2=pf1; 此时,直接引用函数名等效于在函数名上应用取地址操作符: cmpfcn pf1=lengthcompare; cmpfcn pf2=lengthcompare; 注意:函数指针只能通过同类型的函数或函数指针或0值常量表达式进行初始化或赋值。 将函数指针初始化为0,表示该指针不指向任何函数。 指向不两只函数类型的指针之间不存在转换: string::size_type sumLength(const string &,const string &); bool cstringCompare(char *,char *); //pointer to function returning bool taking two const string& cmpFcn pf;//error:return type differs pf=cstringCompare;//error:parameter types differ pf=lengthCompare;//ok:function and pointer types match exactly 3.通过指针调用函数 指向函数的指针可用于调用它所指向的函数。可以不需要使用解引用

C++语言程序设计中函数指针论文

C++语言程序设计中函数指针的分析与研究摘要:指针作为c++语言程序设计中的一个重要概念,其应用也是c++语言程序设计中的非常重要的一个内容。指针作为一种特殊的数据结构类型,它可以有效地表示数据之间复杂的逻辑结构关系。灵活正确地运用指针可以给程序的设计带很多的便捷,其中效果最为显著的就是函数指针的应用,通过使用函数指针,可以在调用函数时可以获得多个返回值以及实现对内存地址的直接处理等。本文从对c++语言程序设计中的函数指针的介绍谈起,然后详细说明了使用c++语言程序设计函数指针需要注意的问题,最后就c++语言程序设计中函数指针的应用技巧进行了系统的分析。 关键词:c++语言程序设计;函数指针;分析研究 中图分类号:tp311.11 文献标识码:a文章编号:1007-9599 (2011) 24-0000-01 analysis and research of function pointers for c++ language programming zhang suxia (shandong rural credit cooperatives,qingdao266550,china) abstract:pointer as c++ language programming is an important concept,its application is the c++ programming language is very important content.pointer as a special type of data structure,which can effectively express complex data between the logical structure of the relationship.flexible

c语言指针习题及答案69923

指针习题及答案 一.选择题 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完全相同

函数指针与指针函数的区别

函数指针与指针函数的关系 【函数指针】 在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。1.函数指针定义 函数类型(*指针变量名)(形参列表); “函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如: int (*f)(int x); double (*ptr)(double x); 在定义函数指针时请注意: 函数指针和它指向的函数的参数个数和类型都应该是—致的; 函数指针的类型和函数的返回值类型也必须是一致的。 2.函数指针的赋值 函数名和数组名一样代表了函数代码的首地址,因此在赋值时,直接将函数指针指向函数名就行了。 例如, int func(int x); /* 声明一个函数*/ int (*f) (int x); /* 声明一个函数指针*/ f=func; /* 将func函数的首地址赋给指针f */ 赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。 3.通过函数指针调用函数 函数指针是通过函数名及有关参数进行调用的。 与其他指针变量相类似,如果指针变量pi是指向某整型变量i的指针,则*p等于它所指的变量i;如果pf是指向某浮点型变量f的指针,则*pf就等价于它所指

的变量f。同样地,*f是指向函数func(x)的指针,则*f就代表它所指向的函数func。所以在执行了f=func;之后,(*f)和func代表同一函数。 由于函数指针指向存储区中的某个函数,因此可以通过函数指针调用相应的函数。现在我们就讨论如何用函数指针调用函数,它应执行下面三步: 首先,要说明函数指针变量。 例如:int (*f)(int x); 其次,要对函数指针变量赋值。 例如:f=func; (func(x)必须先要有定义) 最后,要用(*指针变量)(参数表);调用函数。 例如:(*f)(x);(x必须先赋值) 【例】任意输入n个数,找出其中最大数,并且输出最大数值。 main() { int f(); int i,a,b; int (*p)(); /* 定义函数指针*/ scanf("%d",&a); p=f; /* 给函数指针p赋值,使它指向函数f */ for(i=1;i<9;i++) { scanf("%d",&b); a=(*p)(a,b); /* 通过指针p调用函数f */ } printf("The Max Number is:%d",a) } f(int x,int y) { int z;

指针函数与函数指针的区别

指针函数与函数指针的区别 一、 在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义: 1、指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针 类型标识符 *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。 表示: float *fun(); float *p; p = fun(a); 注意指针函数与函数指针表示方法的不同,千万不要混淆。最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。来讲详细一些吧!请看下面 指针函数: 当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中。 格式: 类型说明符* 函数名(参数) 当然了,由于返回的是一个地址,所以类型说明符一般都是int。 例如:int *GetDate(); int * aaa(int,int); 函数返回的是一个地址值,经常使用在返回数组的某一元素地址上。 int * GetDate(int wk,int dy); main() { int wk,dy; do { printf(Enter week(1-5)day(1-7)\n); scanf(%d%d,&wk,&dy); } while(wk<1||wk>5||dy<1||dy>7); printf(%d\n,*GetDate(wk,dy));

习题六指针与函数

1.指针 (1) 有以下程序 void f( int y,int *x) {y=y+*x; *x=*x+y;} main( ) { int x=2,y=4; f(y,&x); printf(“%d %d\n”,x,y); } 执行后输出的结果是【1】。 (2) 下面程序的运行结果是:[2] 。 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); } (3) 设有以下程序: main() { int a, b, k=4, m=6, *p1=&k, *p2=&m; a=pl= =&m; b=(*p1)/(*p2)+7; printf(“a=%d\n”,a); printf(“b=%d\n”,b); } 执行该程序后,a的值为【3】,b的值为【4】。 (4) 下列程序的输出结果是【5】。 void fun(int *n) { while( (*n)--) printf(“%d”,++(*n)); } main() { int a=100; fun(&a); } (5) 以下函数用来求出两整数之和,并通过形参将结果传回,请填空。 void func(int x,int y, [6] z) { *z=x+y; } (6) 函数void fun(float *sn, int n)的功能是:根据以下公式计算S,计算结果通过形参指针sn 传回;n通过形参传入,n的值大于等于0。请填空。

void fun( float *sn, int n) { float s=0.0, w, f=-1.0; int i=0; for(i=0; i<=n; i++) { f= [7] * f; w=f/(2*i+1); s+=w; } [8] =s; } (7) 以下函数的功能是,把两个整数指针所指的存储单元中的内容进行交换。请填空。 exchange(int *x, int *y) { int t; t=*y; *y= 【9】; *x= 【10】; } (8) 下面函数要求用来求出两个整数之和,并通过形参传回两数相加之和值,请填空。 int add(int x,int y, 【11】z) { 【12】=x+y;} 2.函数 (1) 给出年、月、日,问是星期几(星期日~六用0~6表示)。 #include int month_to_day(int c); void show(int d); int year,month,day; int main() { cout<<"请输入年月日"<>year>>month>>day; int a=year-1900,b=a/4,c=month-1,d;//a表示过了几年,b表示a中有几年是闰年,//c表示过了几个月,d表示一共有多少天 c=month_to_day(c); //把月份转成天数 if(a%4==0&&a!=0) //判断输入的年份是不是闰年 { b=b-1; c=c+1; d=(a-b)*365+b*366+c; } else d=(a-b)*365+b*366+c+day; show(d); //输出星期几 return 0; }

C++考试题(选择题)

1、选择题 1、___A__只能访问静态成员变量。 A 静态函数 B 虚函数 C 构造函数 D 析构函数 2、下列的各类函数中,__C___不是类的成员函数。 A 构造函数 B 析构函数C友元函数 D 拷贝构造函数 3、友元的作用_A__。 A 提高程序的运行效率 B 加强类的封装性 C 实现数据的隐藏性 D 增加成员函数的种类 4、类模板的使用实际上是将类模板实例化成一个具体的_D____。 A 类 B 对象 C 函数 D 模板类 5、下列函数中,___C__不能重载。 A 成员函数 B 非成员函数 C 析构函数 D 构造函数 6、___C__是一个在基类中说明的虚函数,它在该基类中没有定义,但要求任何派生类都必须定义自己的版本。 A 虚析构函数B虚构造函数C纯虚函数 D 静态成员函数 7、__A___是istream的派生类,处理文件输入;___C__是iostream的派生类,可以同时处理文件的I/O。 A、ifstream B、ostream C、fstream D、ofstream 8、对于派生类的构造函数,在定义对象时构造函数的执行顺序为: 先执行__A___,再执行__B___,后执行__C___。 A 成员对象的构造函数 B 基类的构造函数 C 派生类本身的构造函数 9、局部变量可以隐藏全局变量,那么在有同名全局变量和局部变量的情形时,可以用__A___提供对全局变量的访问。 A 域运算符 B 类运算符 C 重载 D 引用 10、一个__C___允许用户为类定义一种模式,使得类中的某些数据成员及某些成员函数的返回值能取任意类型。 A 函数模板 B 模板函数 C 类模板 D 模板类 11、系统在调用重载函数时,往往根据一些条件确定哪个重载函数被调用,在下列选项中,不能作为依据的是___D__。 A 参数个数 B 参数的类型 C 函数名称D函数的类型 12、如果一个类至少有一个纯虚函数,那么就称该类为__A___。 A 抽象类 B 虚基类 C 派生类 D 以上都不对 13、进行文件操作时需要包含__B___文件。 A iostream B fstream C stdio.h D stdliB、h 14、在C++中,打开一个文件,就是将这个文件与一个__B___建立关联;关闭一

指向函数的指针

指向函数的指针 c/c++ 2010-11-20 13:17:02 阅读41 评论0 字号:大中小订阅首先看这个程序: #include using namespace std; void max(int a, int b) { cout<<"now call max("<b?a:b; cout<

我曾经写过一个命令行程序,有很多命令,于是构着了一个结构的数组,大概是这样 struct{ char *cmd_name; bool (*cmd_fun)(); }cmd_info_list[MAX_CMD_NUM]; 程序中得到一个用户输入的命令字符串后,就匹配这个数组,找到对应的处理函数。 以后每次添加一个命令,只需要加个函数,然后在这个数组中加一个记录就可以了,不需要修改太多的代码。 这可以算是一种用法吧。呵呵。 Windows 中,窗口的回调函数就用到了函数指针。 用VC向导 New Projects ----> Win32 Application ----> A typical "Hello World!" application 其中的WndProc 是WNDPROC 类型的函数typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM); WndProc 作为窗口的回调函数,用来填充WNDCLASSEX 结构。 WNDCLASSEX wcex; wcex.lpfnWndProc = (WNDPROC)WndProc; void ListTraverse(LinkList L,void (*visit)(int)) { Link p; p=L->next; while(p) { visit(p->data); p=p->next; } return OK; } void print(int c) { printf("%d",c); } ListTraverse(L,print); 这算是个例子吧??? #include #include #include double Add (double x, double y) { return x+y; } double Sub (double x, double y) { return x-y; } double Mul (double x, double y)

第8章-指针练习题

指针思考题 一、填空题 【1】下面函数要求用来求出两个整数之和,并通过形参传回两数相加之和值,请填空。 int add( int x, int y, ) { =x+y;} 【2】若有定义: char ch; (1) 使指针p 可以指向变量ch的定义语句是。 (2) 使指针p指向变量ch的赋值语句是。 (3) 通过指针p给变量ch读入字符的scanf函数调用语句是。 (4) 通过指针p 给变量ch赋字符A的语句是。 (5) 通过指针p输出ch中字符的语句是。 (6) 在16位微机上,指针变量p在内存中所占字节数是,变量ch在内在所占字 节数是。 二、选择题 【3】若有说明:int i,j=7,*p=&i;则与i=j;等价的语句是()。 A.i=*p; B.*p=*&j; C.i=&j; D.i=**p; 【4】若有定义:int x,*pb;则正确的赋值表达式是()。 A.pb=&x B.pb=x C. *pb=&x D.*pb=*x 【5】对于类型相同的指针变量,不能进行的运算是()。 A.< B. = C. + D. – 【6】以下程序的输出结果是()。 A.23 B. 24 C. 25 D. 26 Void fun ( int *x) { printf(%d\n”,++*x); } main( ) { int a=25; fun (&a); } 【7】以下程序的输出结果是()。 A.6 B. 7 C. 8 D. 9 main() { int k=2,m=4,n=6; int *pk=&k,*pm=&m,*p; *(p=&n)=*pk*(*pm); printf("%d\n",n); } 【8】以下程序的输出结果是()。 A.100 B. 50 C. 101 D.200 main() { int *v,b; v=&b; b=100;

C++填空选择题

C++程序设计模拟试卷(一) 一、单项选择题 1. 编写C++程序一般需经过的几个步骤依次是() A. 编辑、调试、编译、连接 B. 编辑、编译、连接、运行 C. 编译、调试、编辑、连接 D. 编译、编辑、连接、运行 答案:B 解析:(P21)经过编辑、编译、连接和运行四个步骤。编辑是将C++源程序输入计算机的过程,保存文件名为cpp。编译是使用系统提供的编译器将源程序cpp生成机器语言的过程,目标文件为obj,由于没有得到系统分配的绝对地址,还不能直接运行。连接是将目标文件obj转换为可执行程序的过程,结果为exe。运行是执行exe,在屏幕上显示结果的过程。 2. 决定C++语言中函数的返回值类型的是() A. return语句中的表达式类型 B. 调用该函数时系统随机产生的类型 C. 调用该函数时的主调用函数类型 D. 在定义该函数时所指定的数据类型 答案:D 解析:(P51)函数的返回值类型由定义函数时的指定的数据类型决定的。A项的表达式的值要转换成函数的定义时的返回类型。 3. 下面叙述不正确的是() A. 派生类一般都用公有派生 B. 对基类成员的访问必须是无二义性的 C. 赋值兼容规则也适用于多重继承的组合 D. 基类的公有成员在派生类中仍然是公有的 答案:D 解析:(P136)继承方式有三种:公有、私有和保护。多继承中,多个基类具有同名成员,在它们的子类中访问这些成员,就产生了二义性,但进行访问时,不能存在二义性。赋值兼容规则是指派生类对象可以当作基类对象使用,只要存在继承关系,所以单继承或多继承都适用。基类中的公有成员采用私有继承时,在派生类中变成了私有成员,所以D项错误。 4. 所谓数据封装就是将一组数据和与这组数据有关操作组装在一起,形成一个实体,这实体 也就是() A. 类 B. 对象 C. 函数体 D. 数据块 答案:A 解析:(P39)类即数据和操作的组合体,数据是类的静态特征,操作是类具有的动作。 5. 在公有派生类的成员函数不能直接访问基类中继承来的某个成员,则该成员一定是基类中

c+练习题带答案

一、选择题 1.C++语言属于( C )。 A)自然语言 B)机器语言 C)面向对象语言 D)汇编语言 2.下面选项中不属于面向对象程序设计特征的是(C) 。 A)继承性 B)多态性 C)相似性 D)封装性 3.下列情况中,哪一种情况不会调用拷贝构造函数( B ) A)用派生类的对象去初始化基类对象时 B)将类的一个对象赋值给该类的另一个对象时 C)函数的形参是类的对象,调用函数进行形参和实参结合时 D)函数的返回值是类的对象,函数执行返回调用者时 4.以下哪一关键字可用于重载函数的区分(C) A)extern B)static C)const D)virtual 5.下列有关数组的叙述中,正确的是( B ) A)C++中数组的存储方式为列优先存储 B)数组名可以作为实参赋值给指针类型的形参 C)数组下标索引从1开始,至数组长度n结束 D)数组指针的语法形式为:类型名 *数组名[下标表达式]; 6.下列有关继承和派生的叙述中,正确的是( C ) A)派生类不能访问通过私有继承的基类的保护成员 B)多继承的虚基类不能够实例化 C)如果基类没有默认构造函数,派生类就应当声明带形参的构造函数 D)基类的析构函数和虚函数都不能够被继承,需要在派生类中重新实现 7.若有下面的函数调用: fun(a+b, 3, max(n-1, b)); 其中实参的个数是( A) A)3 B)4 C)5 D)6 8.下列关于this指针的说法正确的是( B) A)this指针存在于每个函数之中 B)在类的非静态函数中this指针指向调用该函数的对象 C)this指针是指向虚函数表的指针 D)this指针是指向类的函数成员的指针 9.在下列关于C++函数的叙述中,正确的是(C) A)每个函数至少要有一个参数B)每个函数都必须返回一个值 C)函数在被调用之前必须先声明D)函数不能自己调用自己 10.下列运算符中,不能重载的是(C) A)&& B)!= C). D)-> 11.下面程序的输出结果是(B) #include using namespace std; int i = 0; int fun(int n) { static int a = 2; a++; return a+n; } void main() {

函数指针和指针函数的理解

我知道函数指针是指向函数的指针,指针函数还是指一个函数的返回值是一个指针,但下面的几道题还是感觉很迷惑。各位能否讲的详细点呢? (1)float(**def)[10]def是什么? (2)double*(*gh)[10]gh是什么? (3)double(*f[10])()f是什么? (4)int*((*b)[10])b是什么? 这样老感觉有点乱,有什么窍门可以记得并理解的清楚一点么? (1)def是一个指针,指向的对象也是一个指针,指向的指针最终指向的是10个float构成的数组. (2)gh是指针,指向的是10个元素构成的数组,数组的元素是double*类型的指针. (3)f是10个元素构成的数组,每个元素是指针,指针指向的是函数,函数类型为无参数且返回值为double.下面要讲的窍门的例子跟这个很类似. (4)b是指针,指向的是10个元素构成的数组,数组元素为int*类型的指针. 窍门如下: 如果我们碰到复杂的类型声明,该如何解析它?例如: char(*a[3])(int); a到底被声明为什么东东?指针?数组?还是函数? 分析时,从a最接近(按运算符优先级)处开始。我们看到a最接近符号是[]——注意:*比[]的优先级低。a后既然有[],那么a是数组,而且是包含3个元素的数组。 那这个数组的每个元素是什么类型呢?虽然数组a只含有a[0]、a[1]、a[2]三个元素,a[3]实际上已经越界,但在分析数组a的元素的类型时,我们正好需要形式上的元素a[3]。知道了a[3]的类型,就知道了a的元素的类型。a[3]是什么类型?是指针,因为它的前面有*.由此可知,数组a的元素是指针。 光说是指针还不够。对于指针,必须说出它指向的东东是什么类型。它指向的东东是什么,就看*a[3]是什么(a[3]是指针,它指向的东东当然是*a[3])了。继续按优先级观察,我们看到*a[3]后面有小括号,所以可以肯定*a[3]是函数。即数组a的元素是指向函数的指针。 指向的是什么类型的函数?这很明显,是入参为int、返回值为char的类型的函数。 至此解析完毕。

函数、指针与结构体练习题_参考答案

函数 (一)选择题 1.以下正确的说法是_________. 建立函数的目的之一是a)提高程序的执行效率 b)提高程序的可读性 c)减少程序的篇幅 d)减少程序文件所占存 2.以下正确的函数原型声明形式是________. a)double fun(int x,int y) b)double fun(int x; int y) c)double fun(int x, int y); d)double fun(int x,y); 3.C语言规定,简单变量做实参时,它和对应形参之间的数据传递方式为______. A)地址传递 B)单向值传递 C)由实参传给形参,再由形参传回给实参 D)由用户指定传递方式 4.C语言允许函数值类型缺省定义,此时该函数值隐含的类型是______. a)float b)int c)long d)double 5.已有以下数组定义和f函数调用语句,则在f函数的说明中,对形参数组array 的错误定义方式为________. int a[3][4]; f(a); a)f(int array[][6])

b)f(int array[3][]) c)f(int array[][4]) d)f(int array[2][5]) 6.以下程序的正确运行结果是_________. #include void num() { extern int x,y;int a=15,b=10; x=a-b; y=a+b; } int x,y; main() { int a=7,b=5; x=a+b; y=a-b; num(); printf("%d,%d\n",x,y); } a)12,2 b)不确定c)5,25 d)1,12 7.以下正确的描述是____________. a)C语言的预处理功能是指完成宏替换和包含文件的调用 b)预处理指令只能位于C源程序文件的首部 c)凡是C源程序中行首以"#"标识的控制行都是预处理指令 d)C语言的编译预处理就是对源程序进行初步的语法检查 8.在"文件包含"预处理语句的使用形式中,当#include后面的文件名用< >(尖括号)括起时,找寻被包含文件的方式是_______. a)仅仅搜索当前目录 b)仅仅搜索源程序所在目录

C语言——指向函数的指针

1函数类型(* 函数指针变量)();//指向函数的入口地址 一个函数是若干语句的集合,经编译后存储在函数代码存储区,并占有一片连续的存储空间,对函数指针只能用函数名赋值而无其他运算 1#include 2 3int max(int x ,int y); 4 5int main() 6{ 7int(* p)() ;//定义p是指向函数的指针变量 8int a , b , c ; 9 10p= max ;//将函数max的入口地址赋给指针变量p 11scanf("%d %d",&a ,&b) ; 12c= (* p)(a , b) ;//用指向函数的指针变量p调用函数 13printf("a = %d , b = %d , max = %d", a , b , c); 14 15return0; 16} 17 18int max(int x ,int y) 19{ 20int k ; 21k= (x> y)? x : y ; 22 23return k ; 24} 函数名作为实际参数: 1 #include 2 3int fun1(int a , int b) 4 { 5return a+b ; 6 } 7 8int fun2(int (*q)() , int x , int y) 9 { 10return (*q)(x , y) ; 11 } 12 13int main() 14 { 15int (*p)() , k ; 16 p = fun1 ;

17 k = fun2( p , 8 , 5 ) ; 18 19printf("k = %d \n" , k); //输出 13 20 21return0 ; 22 } 设置一个函数proc ,每次调用它会实现不同的功能,输入 a , b 两个数,第一次调用proc时,找出两者中最大者,第二次找出最小者,第三次调用求两数之差: 1 #include 2 3int max(int *x , int *y); 4int min(int *x , int *y); 5int a_b(int *x , int *y); 6int proc(int *x , int *y , int(*p)()); 7 8int main() 9 { 10int a , b ; 11 12printf("Enter a and b :"); 13scanf("%d %d" , &a , &b); 14 15printf("a = %d \t b = %d \n" , a , b); 16 17printf("max(%d,%d) = " , a , b); 18 proc(&a , &b , max); 19 20printf("min(%d,%d) = " , a , b); 21 proc(&a , &b , min); 22 23printf("%d - %d = " , a , b); 24 proc(&a , &b , a_b); 25 26return0 ; 27 } 28 29int max(int *x , int *y) 30 { 31int k ; 32 33 k = (*x > *y) ? *x : *y ; 34 35return k ; 36 } 37 38int min(int *x , int *y)

相关文档