习题六指针与函数
教材课后题答案-第6章_指针习题答案
习题解答一、单项选择题1.若定义了int n=2, *p=&n, *q=p;则下面【】的赋值是非法的。
A.p=qB. *p=*qC. n=*qD. p=n【答案】D2.若定义了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);【答案】C3.若定义了int a[10], i=3, *p; p=&a[5];下面不能表示为a数组元素的是【】。
A.p[-5]B. a[i+5]C. *p++D. a[i-5]【答案】D4.若有如下定义:int n[5]={1,2,3,4,5},*p=n;则值为5的表达式是【】。
A.*+5B. *(p+5)C. *p+=4D. p+4【答案】C5.设变量b的地址已赋给指针变量ps,下面为“真”的表达式是【】。
A.b==&psB. b==psC. b==*psD. &b==&ps【答案】C6.设有以下定义和语句: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]【答案】C7.若定义了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);【答案】B8.若有下面的程序段,则不正确的fxy函数的首部是【】。
C语言指针习题和答案精选文档
C语言指针习题和答案精选文档TTMS system office room 【TTMS16H-TTMS2A-TTMS8Q8-一、用指针方法编写一个程序,输入3个整数,将它们按由小到大的顺序输出#include <>void swap(int *pa,int *pb){int temp;temp = *pa;*pa = *pb;*pb = temp;}void main(){int a,b,c,temp;scanf("%d%d%d",&a,&b,&c);if(a>b)swap(&a,&b);if(b>c)swap(&b,&c);if(a>c)swap(&a,&c);printf("%d,%d,%d",a,b,c);}二、C语言用指针方法输入3个字符串按由小到大顺序输出#include ""#include ""int main(int argc, char* argv[]){char *t;char *p1=NULL,*p2=NULL,*p3=NULL;char ch1[20]={0},ch2[20]={0},ch3[20]={0};p1=ch1;p2=ch2;p3=ch3;printf("No1:");scanf("%s",p1);fflush(stdin);printf("No2:");scanf("%s",p2);fflush(stdin);printf("No3:");scanf("%s",p3);fflush(stdin);if(strcmp(p1,p2)>0){t=p1;p1=p2;p2=t;}if(strcmp(p1,p3)>0){t=p1;p1=p3;p3=t;}if(strcmp(p2,p3)>0){t=p2;p2=p3;p3=t;}printf("%s\n%s\n%s\n",p1,p2,p3);return 0;}编程输入一行文字,找出其中的大写字母,小写字母,空格,数字,及其他字符的个数#include<>void main(){int a=0,b=0,c=0,d=0,e=0,i=0;char *p,s[20];while((s[i]=getchar())!='\n')i++;p=s;while(*p!=10){if(*p>='A'&&*p<='Z')a++;else if(*p>='a'&&*p<='z')b++;else if(*p==' ')c++;else if(*p>='0'&&*p<='9')d++;else e++;p++;}printf("大写字母 %d 小写字母 %d\n",a,b);printf("空格 %d 数字 %d 非字符 %d\n",c,d,e);}写一个函数,将3 3矩阵转置#include ""void Transpose(int (*matrix)[3]){int temp;int i, j;for(i=1;i<3;i++)/*转置*/{for(j=0;j<i;j++){temp = *(*(matrix+j)+i);*(*(matrix+j)+i) = *(*(matrix+i)+j); *(*(matrix+i)+j) = temp;}}}void main(){int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; Transpose(a);for(int i = 0;i<3;i++){for(int j=0;j<3;j++){printf("%d ",a[i][j]);}printf("\n");}}}用指向一维数组的指针做函数参数#include<>#include<>int main(){void sort(char (*s)[6]);3”n",*(month_name+n));elseprintf("It is wrong.\n");}运行结果:① Input month: 2↙It is February.② Input month: 8↙It is August.③ Input month: 13↙It is wrong.9.11c语言:将字符串computer赋给一个字符数组,然后从第一个字母开始间隔地输出该串。
c语言期末实操复习题
c语言期末实操复习题### C语言期末实操复习题#### 一、基础语法题1. 变量声明与初始化编写一个程序,声明一个整型变量`a`和一个浮点型变量`b`,并将它们分别初始化为10和3.14。
2. 数据类型转换编写代码,将一个整数`x`(例如100)转换为浮点数,并打印转换后的值。
3. 条件语句编写一个程序,使用`if-else`语句判断一个整数`n`是否为正数、负数或零。
4. 循环结构使用`for`循环打印出1到10的数字。
5. 数组操作声明一个整型数组`arr`,包含5个元素,初始化为1, 2, 3, 4, 5,并使用循环打印数组元素。
#### 二、函数与指针1. 函数定义与调用定义一个函数`add`,接受两个整数参数并返回它们的和。
在主函数中调用该函数。
2. 指针基础编写一个程序,声明一个整型变量`num`和一个指向整型的指针`p`,将`num`的地址赋给`p`,并打印通过`p`访问的值。
3. 指针与数组使用指针操作上述数组`arr`,打印数组的最后一个元素。
4. 函数与指针定义一个函数`increment`,该函数接受一个整型指针参数,并使该指针指向的值增加1。
#### 三、结构体与联合体1. 结构体定义与使用定义一个结构体`Student`,包含学生的姓名(字符数组)、学号(整数)和成绩(浮点数)。
声明一个`Student`类型的变量,并初始化。
2. 结构体与指针编写一个函数,接受一个指向`Student`结构体的指针,并打印该学生的姓名和成绩。
3. 联合体基础定义一个联合体`Data`,可以存储整数、浮点数或字符。
声明一个`Data`类型的变量,并分别存储不同类型的数据。
#### 四、文件操作1. 文件的打开与关闭编写一个程序,打开一个文本文件(例如`example.txt`),读取文件内容,并在屏幕上打印,最后关闭文件。
2. 文件的写入编写代码,将字符串"Hello, World!"写入到一个新文件中。
(完整word版)六、指针_选择题(答案)
六、指针183.下程序的运行结果是( A )。
void ast (int x,int y,int *cp,int *dp){ *cp=x+y; *dp=x—y;}main(){ int a=4,b=3,c,d;ast(a,b,&c,&d);printf(”%d,%d\n”,c,d);}A. 7,1B. 1,7C. 7,—1D. c、d未赋值,编译出错执行 ast(a,b,&c,&d);调用ast 函数,把a传递给x,b传递给y,c的地址传递给cp,d的地址传递给dp。
因为cp=&c(cp的值为c变量的地址),所以*cp等价于c,执行*cp=x+y ;后c=4+3=7同理,因为dp=&d,所以*dp等价于d,执行*dp=x—y;后d=4—3=1执行 printf("%d,%d\n",c,d);后输出7,1184.有以下语句:int a[5]={0,1,2,3,4,5},i;int *p=a;设0≤i<5,对a数组元素不正确的引用是( C )。
A.*(&a[i])B. a[p—a]C.*(*(a+i))D. p[i]1.指针运算符取地址运算符&:其功能是取变量的地址。
须是指针变量。
A . *(&a[i]) 等价于a[i]B. a[p—a]等价于a[0]C. 因为*(a+i)等价于a[i] 所以*(*(a+i))等价于*(a[i]) ,又因为在*运算符之后跟的变量必须是指针变量,我们断定*a[i]是错的,所以*(*(a+i))也是错.D。
因为P=a,所以P[i]等价于a[i]185.若有定义int *p1,*p2; 则错误的表达式是( A )。
A. p1+p2B. p1—p2C. p1<p2D. p1=p2两个指针变量可以相减(结果表示介于二者之间元素的个数),可以比较大小,但不能相加。
186.以下叙述错误的是( D )。
函数、指针与结构体练习题-参考答案
(一)选择题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)floatb)intc)longd)double5.已有以下数组定义和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,127.以下正确的描述是____________.a)C语言的预处理功能是指完成宏替换和包含文件的调用b)预处理指令只能位于C源程序文件的首部c)凡是C源程序中行首以"#"标识的控制行都是预处理指令d)C语言的编译预处理就是对源程序进行初步的语法检查8.在"文件包含"预处理语句的使用形式中,当#include后面的文件名用< >(尖括号)括起时,找寻被包含文件的方式是_______.a)仅仅搜索当前目录b)仅仅搜索源程序所在目录c)直接按系统设定的标准方式搜索目录d)先在源程序所在目录搜索,再按照系统设定的标准方式搜索9.当调用函数时,实参是一个数组名,则向函数传送的是_____.A.数组的长度B.数组的首地址C.数组每一个元素的地址D.数组每个元素中的值10.函数的值通过return语句返回,下面关于return语句的形式描述错误的是_____.表达式; (表达式);C.一个return语句可以返回多个函数值D.一个return语句只能返回一个函数值11.设函数fun的定义形式为void fun(char ch,float x){…}则以下对函数fun的调用语句中,正确的是_____.("abc",; =fun('D',; ('65',; (32,32);12.以下程序的输出结果是_____.void reverse(int a[],int n){ int i,t;for(i=0;i<n/2;i++){ t=a[i]; a[i]=a[n-1-i];a[n-1-i]=t;}}main( ){ int b[10]={1,2,3,4,5,6,7,8,9,10}; int i,s=0;reverse(b,8);for(i=6;i<10;i++)s+=b[i];printf(" %d\n ",s);}B.1013.阅读下列程序,则运行结果为_____.fun( ){ static int x=5;x++;return x;}main( ){ int i,x;for(i=0;i<3;i++)x=fun( );printf("%d\n",x);}B.614.若使用一维数组名作函数实参,则以下正确的说法是_____.A.必须在主调函数中说明此数组的大小B.实参数组类型与形参数组类型可以不匹配C.在被调用函数中,不需要考虑形参数组的大小D.实参数组名与形参数组名必须一致15.在C语言中,定义函数时函数的类型可以缺省,此时函数的隐含类型是_____. 16.在C语言中,形参的缺省存储类别是( ).17.以下关于字符串的叙述中正确的是_____.语言中有字符串类型的常量和变量B.两个字符串中的字符个数相同时才能进行字符串大小的比较C.可以用关系运算符对字符串的大小进行比较D.空串一定比空格打头的字符串小18.阅读程序,选择程序的运行结果。
函数和指针题目1(带答案)
1、有以下程序Array char fun(char x , char y){if(x<y) return x;return y;}void main( ){int a='9',b='8',c='7';cout<<fun(fun(a,b),fun(b,c));}程序的执行结果是(D )A)函数调用出错 B)8 C)9 D)72、有以下程序int f(int b[][4]){int i,j,s=0;for(j=0;j<4;j++){i=j;if(i>2) i=3-j;s+=b[i][j];}return s;}void main( ){cout<<f(a)<<endl;}执行后的输出结果是(D )A)12 B)11 C)18 D)163、有以下程序void f(int a[],int i,int j){int t;if(i<j){t=a[i]; a[i]=a[j];a[j]=t;f(a,i+1,j-1);}}void main( ){int i,aa[5]={1,2,3,4,5};f(aa,0,4);for(i=0;i<5;i++) cout<<aa[i]<< ",";cout<<endl;}执行后输出结果是(A)A)5,4,3,2,1, B)5,2,3,4,1, C)1,2,3,4,5, D)1,2,3,4,5,7、以下能正确定义数组并正确赋初值的语句是(D)A) int N=5,b[N][N];B) int a[1][2]={{1},{3}};C) int c[2][]={{1,2},{3,4}};D) int d[3][2]={{1,2},{3,4}};8、以下叙述中正确的是(B)A) 全局变量的作用域一定比局部变量的作用域范围大B) 静态(static)类别变量的生存期贯穿于整个程序的运行期间C) 函数的形参都属于全局变量D) 未在定义语句中赋初值的auto变量和static变量的初值都是随机值9、下面rotate函数的功能是:将n行n列的矩阵A转置为A’,例如:1 2 3 4 1 5 9 135 6 7 8 2 6 10 14当 A=9 10 11 12 则 A’= 3 7 11 1513 14 15 16 4 8 12 16请填空const int N =4void rotate(int a[][N]){ int i,j,t;for(i=0;i<N;i++)for(j=0;_____________;j++) j<=i{t=a[i][j];____________;a[i][j]=a[j][i]a[j][i]=t;}}10、若有以下程序void main(){int a[4][4]={{1,2,-3,-4},{0,-12,-13,14} ,{-21,23,0,-24},{-31,32,-33,0}};int i,j,s=0;for(i=0;i<4;i++)for(j=0;j<4;j++){if(a[i][j]<0) continue;if(a[i][j]==0) break;s+=a[i][j];}cout<<s<<endl;}执行后输出结果是______________。
C语言指针习题及答案
指针主要内容的习题及答案一.选择题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)265.若有说明: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 。
函数指针习题
函数、指针练习题一、选择题1. 若有”fun(int a[],int n)”,以下说法正确的是( )。
A.函数的类型为单精度类型B.第一个实参应该是数组名C.实参和形参之间是一个值传递的过程D.以上说法都不对2. 下列有关函数调用的说法不正确的是( )。
A.若用值传递方式,则形式参数在函数被调用时才分配内存B.实际参数和形式参数不可以同名C.主调函数和被调用函数可以不在同一个文件中D.函数间传送数据可以使用外部全局变量3. 下列叙述中正确的是( )。
A.函数可以嵌套定义,但不能嵌套调用B.函数可以嵌套调用,也可以嵌套定义C.函数不可以嵌套定义,也不可以递归调用D.函数可以嵌套调用,但不能嵌套定义4. 若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是( )。
A.函数的实参和其对应的形参共占同一存储单元B.形参只是形式上的存在,不占用具体存储单元C.同名的实参和形参占同一存储单元D.函数的形参和实参分别占用不同的存储单元5. 函数中未指定存储类型的变量,其隐含的存储类型是( )。
A.static B.auto C.extern D.register6. 在一个C语言源程序文件中所定义的全局变量,其作用域为( )。
A.所在文件的全部范围B.所在程序的全部范围C.所在函数的全部范围D.由具体定义位置和extern 说明来决定范围7. 所谓静态存储即是在程序运行期间分配固定的( )。
A.变量名称B.变量值C.存储单元D.作用域8. 设函数中有整型变量n,为保证其在未赋值的情况下初值为0,应选择的存储类别是( )。
A.auto B.register C.static D.auto或register9. 若变量定义时未初始化,则其值不确定的是( )。
A.静态全局变量B.静态局部变量C.局部变量D.全局变量10. 以下叙述中错误的是( )。
A.用户定义的函数中可以没有return 语句B.用户定义的函数中可以有多个return 语句,以便可以调用一次返回多个函数值C.用户定义的函数中若没有return 语句,则应当定义函数为void 类型D.函数的return 语句中可以没有表达式11. 下列关于指针定义的描述中不正确的是( )。
C语言指针练习题解析
一、知识点1.掌握指针、地址、指针类型、空指针(NULL)等概念;2.掌握指针变量的定义和初始化、指针的间接访问、指针的加减运算、指针变量比较运算和指针表达式;3.掌握指针与数组、函数、字符串等的联系;4.掌握动态空间操作(new,delete);5.掌握引用参数的使用。
二、例题分析与解答例题1:若有以下定义,则说法错误的是( )。
int a=100,*p=&a ;A.声明变量p,其中*表示p是一个指针变量B.变量p经初始化,获得变量a的地址C.变量p只可以指向一个整形变量D.变量p的值为100答案:D分析:有指针变量定义可知A、C说法是正确的,故不能选。
在语句中&p=a,表示指针变量取得变量a地址,B说法也正确,也不能选择。
D中不能说变量p的值为100,应该*p的值为100,所以选择D。
例题2:若有以下定义,则赋值正确的是( )。
int a ,b , *p;float c, *q;A.p=&c B.q=p C.p=NULL D.q=new int答案:C分析:指针变量使用规定,不同类型的指针变量不能赋值,也不能取得普通变量地址,故A、B不正确,不能选择。
因为q是float类型指针变量,不能申请int 类型地址,D不正确,也不能选择。
因为任何类型的指针变量都能取得NULL指针,所以C正确。
例题3:如果x是整型变量,则合法的形式是( )。
A.&(x+5) B.*x C.&*x D.*&x答案:D分析:因为C++语言表达式没有地址,A不正确。
C++语言普通变量不能用*运算,因此B和C也不正确。
&x 表示变量x的地址,*&x是x 地址的值,所以D正确。
例题4:若要建立如下关系,错误的语句组是( )。
span style='mso-ignore:vglayout; ;z-index:1;left:0px;margin-left:144px;margin-top:1px;width:256px;height:38px'A. B. C. 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;答案:A分析:在变量类型说明语句中 *表示变量是指针变量,在其他语句中,*称为指针运算,用于访问指针所指向的对象的值,&称为取地址运算,用来得到一个对象的地址。
函数指针练习题
函数指针练习题函数指针是一种特殊的指针类型,它指向可以被调用的函数。
函数指针可以用于实现代码的动态调用、跳转以及回调函数等功能。
本文将通过几个练习题,帮助读者更好地理解函数指针的用法和实际应用。
练习一:使用函数指针实现两个整数的加法```c#include <stdio.h>int add(int a, int b) {return a + b;}int main() {int (*func)(int, int);int a = 10, b = 20;func = add;int result = func(a, b);printf("%d + %d = %d\n", a, b, result);return 0;}```在这个例子中,我们定义了一个函数指针`func`,它指向了一个名为`add`的函数。
通过将函数指针赋值为`add`,我们可以使用函数指针调用`add`函数进行加法运算。
练习二:使用函数指针作为回调函数```c#include <stdio.h>typedef int (*CallbackFunc)(int);int square(int x) {return x * x;}void applyCallback(CallbackFunc callback, int x) {int result = callback(x);printf("Result: %d\n", result);}int main() {CallbackFunc func = square;int num = 5;applyCallback(func, num);return 0;}```在这个例子中,我们定义了一个函数指针类型`CallbackFunc`,它指向一个接受一个整数参数并返回一个整数结果的函数。
我们实现了一个`square`函数,它返回传入参数的平方。
c 指针练习题
c 指针练习题C 指针练习题1. 介绍在C语言中,指针是一种非常重要的概念。
通过指针,我们可以直接访问和操作内存中的数据。
本文将为您提供一些C指针练习题,以帮助您更好地理解和掌握指针的用法。
2. 指针基础题2.1 编写一个程序,声明一个整型变量x,并定义一个指向该变量的指针p。
通过指针p修改变量x的值,并输出修改后的结果。
2.2 编写一个程序,声明一个整型数组a,并定义一个指向数组元素的指针p。
通过指针p遍历数组,并输出每个元素的值。
2.3 编写一个程序,声明一个字符型数组str,并定义一个指向字符串的指针p。
通过指针p遍历字符串,并输出每个字符。
3. 指针与函数题3.1 编写一个函数swap,交换两个整型变量的值。
在主函数中调用该函数,并输出交换后的结果。
3.2 编写一个函数reverse,接受一个字符型字符串作为参数,并将其逆序存储。
在主函数中调用该函数,并输出逆序后的字符串。
4. 动态内存分配题4.1 编写一个程序,使用malloc函数动态分配一个包含10个整型元素的数组,并通过指针遍历数组,并输出每个元素的值。
4.2 编写一个程序,使用calloc函数动态分配一个包含5个双精度浮点数的数组,并通过指针遍历数组,并输出每个元素的值。
4.3 编写一个程序,使用realloc函数动态分配一个包含5个整型元素的数组,并增加3个元素。
然后通过指针遍历数组,并输出每个元素的值。
5. 多级指针题5.1 编写一个程序,声明一个字符型变量c,并定义一个指向该变量的一级指针p1和一个指向p1的二级指针p2。
通过p2修改变量c的值,并输出修改后的结果。
6. 总结通过以上指针练习题,我们可以加深对C指针的理解和应用。
掌握指针的用法对于C语言编程非常重要,它能够提高程序的效率和灵活性。
希望本文能够帮助您更好地理解和运用C指针的知识。
祝您在C语言的学习中取得更好的成果!。
第3章 数据类型——指针习题(有答案)
23.char *(*pfb)(const char *)=fb;
24.B
25.B
int(*pf1)(int);
pf1=f1;//或合并为:int(*pf1)(int)=f1;
char *(*pf2)(int,char *);
pf2=f2;//或合并为:char *(*pf2)(int,char*)=f2;
(2)函数指针的应用:
#include<iostream.h>
intadd(inta,intb){returna+b;}
20.已知变量a,b定义为:inta=99,&b=a;则cout<<a-1<<’,’<<b+1;的输出是()。
21.已知变量x,y定义为:intx[]={99,98,97},&y=x[1];则cout<<y-1<<’,’<<y*2;的输出是()。
22.已知函数fa的原形是:intfa(int,char*);,pfa是指向fa的指针,则pfa的定义是()
D.*(*(X+I)+j)
16.(单选)要使指针变量p指向2维数组A的第一个元素(0行0列元素),正确的赋值表达式是()。
A.p=A或p=A[0][0]
B.p=A[0]或p=A[0][0]
C.p=A[0]或p=&A[0][0]
D.p=A或p=&A[0][0]
17.下列程序功能是:将字符串中的小写字母都改成对应的大写字母,其他字母不变。请更改程序中的错误。
23.已知函数fb的原形是:char *fb(const char *);,pfb是指向fb的指针,则pfb的定义是()。
指针经典练习题及答案教学教材
指针经典练习题及答案二、程序题1、计算字符串中子串出现的次数。
要求:用一个子函数subString()实现,参数为指向字符串和要查找的子串的指针,返回次数。
2、加密程序:由键盘输入明文,通过加密程序转换成密文并输出到屏幕上。
算法:明文中的字母转换成其后的第4个字母,例如,A变成E(a变成e),Z变成D,非字母字符不变;同时将密文每两个字符之间插入一个空格。
例如,China转换成密文为G l m r e。
要求:在函数change中完成字母转换,在函数insert中完成增加空格,用指针传递参数。
3、字符替换。
要求用函数replace将用户输入的字符串中的字符t(T)都替换为e(E),并返回替换字符的个数。
4、编写一个程序,输入星期,输出该星期的英文名。
用指针数组处理。
5、有5个字符串,首先将它们按照字符串中的字符个数由小到大排列,再分别取出每个字符串的第三个字母合并成一个新的字符串输出(若少于三个字符的输出空格)。
要求:利用字符串指针和指针数组实现。
6、定义一个动态数组,长度为变量n,用随机数给数组各元素赋值,然后对数组各单元排序,定义swap函数交换数据单元,要求参数使用指针传递。
7、实现模拟彩票的程序设计:随机产生6个数字,与用户输入的数字进行比较,输它们相同的数字个数(使用动态内存分配)。
/*1、计算字符串中子串出现的次数。
要求:用一个子函数subString()实现, 参数为指向字符串和要查找的子串的指针,返回次数。
*/#include<stdio.h>int subString(char *a, char *b){int i = 0;int j = 0;int m = 0;char *p = b;while(*a){while(*a){if(*a == *b){break;}a++;}while(*b){if(*a != *b){return m;}else{m = m;}b++;a++;}// a++;b = p;++m;}return m;}int main(){char a[100];char b[100];printf("请输入字符串a:");gets(a);printf("请输入字符串b:");gets(b);printf("%d", subString(a, b));return 0;}/*2、加密程序:由键盘输入明文,通过加密程序转换成密文并输出到屏幕上。
函数与指针选择题
函数与指针练习1、以下叙述中正确的是A) 函数名允许用数字开头B) 函数调用时,不必区分函数名称的大小写C) 调用函数时,函数名必须与被调用的函数名完全一致D) 在函数体中只能出现一次return语句2、函数调用语句:fun( ( exp1, exp2 ), ( exp1, exp2, exp3) ); 含有的实参个数是A) 2 B) 4 C) 5 D) 13、有以下程序#include <stdio.h>main(){ int findmax(int,int,int),m;┋m=findmax(a,b,c);┋}int findmax(int x,int y,int z){ … }则以下叙述正确的是A) 在main函数中声明了findmax函数B) 在main函数中定义了findmax函数C) 在main函数中两次调用了findmax函数D) 在main函数内、外重复定义了findmax函数4、以下叙述中正确的是A) 用户自己定义的函数只能调用库函数B) 实用的C语言源程序总是由一个或多个函数组成C) 不同函数的形式参数不能使用相同名称的标识符D) 在C语言的函数内部,可以定义局部嵌套函数5、以下程序中函数f的功能是:当flag为1时,进行由小到大排序;当flag为0时,进行由大到小排序。
#include <stdio.h>void f(int b[], int n, int flag){int i,j,t;for (i=0; i<n-1; i++)for (j=i+1; j<n; j++)if (flag ? b[i]>b[j] : b[i]<b[j]){ t=b[i]; b[i]=b[j]; b[j]=t; }}main(){int a[10]={5,4,3,2,1,6,7,8,9,10}, i;f(&a[2], 5, 0);f(a, 5, 1);for (i=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,2,1,8,9,10,C) 5,4,3,2,1,6,7,8,9,10,D) 10,9,8,7,6,5,4,3,2,1,6、有以下程序#include <stdio.h> int k=5;void f(int *s){ *s=k; }main(){ int m=3,*p=&m;f(p);printf("%d,%d", m, *p);}程序的运行结果是A) 5,5 B) 3,3 C) 3,5 D) 5,37、以下关于C语言函数参数传递方式的叙述正确的是A) 数据只能从实参单向传递给形参B) 数据可以在实参和形参之间双向传递C) 数据只能从形参单向传递给实参D) C语言的函数参数既可以从实参单向传递给形参,也可以在实参和形参之间双向传递,可视情况选择使用8、有以下程序#include <stdio.h>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("%d,%d,%d\n", a,b,c );}程序运行后的输出结果是A) -5,-12,-7 B) 5,2,3C) -5,-12,-17 D) 5,-2,-79、有以下程序:#include <stdio.h>void fun( int a,int b ){int t;t=a;a=b;b=t;}main(){int c[10]={1,2,3,4,5,6,7,8,9,0},i;for (i=0;i<10;i+=2) fun(c[i],c[i+1]);for (i=0;i<10;i++) printf("%d,",c[i]);printf("\n");}程序的运行结果是()。
指针重要例题演示 (2)
数组的排序和查找
通过指针和比较函数,可 以实现快速排序和二分查 找等算法,提高数组操作 的速度。
使用指针实现动态内存分配
动态内存分配
使用指针可以方便地实现动态内存分配,根据需要申请不同大小 的内存空间。
内存释放
通过指针可以正确地释放已分配的内存,避免内存泄漏和野指针 问题。
使用指针实现二叉树操作
二叉树的创建
通过指针可以方便地创建二叉树节点,并建立父子节点之间的链 接关系。
二叉树的遍历
使用指针可以高效地遍历二叉树中的每个节点,实现前序、中序和 后序遍历。
二叉树的查找和删除
通过指针可以方便地查找和删除二叉树中的节点,实现二叉树的动 态管理。
THANKS
感谢观看
函数 来调用函数。通过函数指针可以传递 函数作为参数,实现回调函数等功能 。
指针与字符串的关系
字符串常量与字符
数组
在C语言中,字符串常量实际上是 一个字符数组,可以通过字符数 组的地址来访问字符串中的字符。
字符串处理函数
C语言标准库提供了许多字符串处 理函数,如`strcpy()`, `strcat()`, `strlen()`等,这些函数通过指针 来操作字符串。
指针的赋值与解引用
总结词
将内存地址赋值给指针并获取该地址处的值
详细描述
通过使用&运算符获取变量的内存地址,并将其赋值给指针变量。解引用指针 是指通过*运算符获取指针所指向的值。例如,int a = 10; int *p = &a; *p = 20; // a的值变为20。
指针的算术运算
总结词
对指针进行加、减、增量和减量等算术运算
CH6-指针练习题及答案
第六章指针练习题及答案一、填空题1、定义int a[]={1,2,3,4,5,6},*p=a;语句printf("%d",(*++p)++);的输出结果是()。
2、以下程序的执行结果是()。
main(){ char s[]="abcdefg"; char *p;p=s; printf("ch=%c\n",*(p+5)); }3、以下程序的执行结果是()。
main(){ int a[][={1,2,3,4,5,6};for(p=&a[5];p>=a;p--) printf("%d",*P);printf("\n"); }4、以下程序的执行结果是()。
main(){ int a[12]={1,2,3,4,5,6,7,8,9,10,11,12},*p[4],i;for(i=0;i<4;i++)p[i]=&a[i*3];printf("%d\n",p[3][2]);}5、设包含如下程序的文件名为myprog.c,编译后键入命令:myprog one two three,则执行结果是()。
main(int argc,char *argv[]){ int i;for(i=1;i<argc;i++)printf("%s%c",argv[i],(i<argc-1)?":');}6、下面程序的运行结果是()char s[80],*sp="HELLO!";sp=strcpy(s,sp); s[0]='h'; puts(s);7、下面程序段的运行结果是()char *s1="AbcdEf",*s2="aB";s1++; t=(strcmp(s1,s2)>0); printf("%d\n",t);8、下面程序段的运行结果是()char str[]="abc\0def\0ghi"; char *p=str; printf("%s",p+5)9、若有以下定义和语句:int a[4]={0,1,2,3},*p; p=&a[1]; 则++(*p)的值是()。
函数及指针练习题
函数练习题【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;{ return(double(sin(x)*sin(x)));【1.61】一个函数内有数据类型说明语句如下:double x,y,z(10);关于此语句的解释,下面说法正确的是____。
C语言指针习题及答案
C语言指针习题及答案1.变量的指针,其含义是指该变量的地址。
2.已有定义int k=2.int *ptr1.*ptr2.且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值语句是ptr2=k。
3.若有说明:int *p。
m=5.n。
以下程序段正确的是p=*p=m。
4.已有变量定义和函数调用语句:int a=25.print_value(&a)。
下面函数的输出结果是26.void print_value(int *x){ printf("%d\n"。
++*x)。
}5.若有说明:int *p1.*p2.m=5.n。
以下均是正确赋值语句的选项是p1= p2=p1.6.若有语句:int *p。
a=4.和p=&a;下面均代表地址的一组选项是&*p。
&a。
p。
7.下面判断正确的是char *s="china"。
等价于char *s。
s="china";8.下面程序段中,for循环的执行次数是6.char*s="\ta\018bc"。
for (。
*s!='\0'。
s++) printf("*");9.下面能正确进行字符串赋值操作的是charstr[10]="china"。
1.strcmp1(char *s,char *t)改写为:int strcmp1(char *s。
char *t) { while (*s == *t) {if (*s == '\0') {return 0;s++;t++;return (*s - *t);2.strcmp2(char *s,char *t)改写为:int strcmp2(char *s。
char *t) {while (*s++ = *t++) {if (!*s) {return 0;return (*s - *t);3.strcmp3(char *s,char *t)改写为:int strcmp3(char *s。
习题六指针与函数
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) 以下函数的功能是,把两个整数指针所指的存储单元中的内容进行交换。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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<iostream.h>int month_to_day(int c);void show(int d);int year,month,day;int main(){cout<<"请输入年月日"<<endl;cin>>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;}elsed=(a-b)*365+b*366+c+day;show(d); //输出星期几return 0;}int month_to_day(int c){switch(c){case 11:c=334;break;case 10:c=304;break;case 9:c=273;break;case 8:c=243;break;case 7:c=212;break;case 6:c=181;break;case 5:c=151;break;case 4:c=120;break;case 3:c=90;break;case 2:c=59;break;case 1:c=31;break;default:break;}return c;}void show(int d){switch(d%7){case 0:cout<<year<<"-"<<month<<"-"<<day<<"是星期日。
"<<endl;break;case 1:cout<<year<<"-"<<month<<"-"<<day<<"是星期一。
"<<endl;break;case 2:cout<<year<<"-"<<month<<"-"<<day<<"是星期二。
"<<endl;break;case 3:cout<<year<<"-"<<month<<"-"<<day<<"是星期三。
"<<endl;break;case 4:cout<<year<<"-"<<month<<"-"<<day<<"是星期四。
"<<endl;break;case 5:cout<<year<<"-"<<month<<"-"<<day<<"是星期五。
"<<endl;break;case 6:cout<<year<<"-"<<month<<"-"<<day<<"是星期六。
"<<endl;break;}}(2) 用递归法将一个整数转换成字符串输出。
#include<iostream>using namespace std;int main(){void convert(int n);int number;cout<<"input an integer:";cin>>number;cout<<"output:"<<endl;if(number<0){cout<<"-";number=-number;}convert(number);cout<<endl;return 0;}void convert(int n){int i;char c;if((i=n/10)!=0)convert(i);c=n%10+'0';cout<<" "<<c;}(3) 有一篇三行文字的文章,每行最多80个字符,编写函数,由实参传递字符串,分别统计文章中大写字母、小写字母、数字、空格及其它字符的个数。
#include "iostream.h"#include "string.h"void main(){char a[100],b[100],c[100];int l1,l2,l3,d=0,x=0,s=0,k=0,q=0,i;cout<<"请输入第一行文字"<<endl;gets(a);cout<<"请输入第二行文字"<<endl;gets(b);cout<<"请输入第三行文字"<<endl;gets(c);l1=strlen(a);l2=strlen(b);l3=strlen(c);for(i=0;i<l1;i++)//统计第一行{ if(a[i]>='a'&&a[i]<='z') x++;if(a[i]>='A'&&a[i]<='Z') d++;if(a[i]>='0'&&a[i]<='9') s++;if(a[i]==' ') k++;}for(i=0;i<l2;i++)//统计第二行{ if(b[i]>='a'&&b[i]<='z') x++;if(b[i]>='A'&&b[i]<='Z') d++;if(b[i]>='0'&&b[i]<='9') s++;if(b[i]==' ') k++;}for(i=0;i<l3;i++)//统计第三行{ if(c[i]>='a'&&c[i]<='z') x++;if(c[i]>='A'&&c[i]<='Z') d++;if(c[i]>='0'&&c[i]<='9') s++;if(c[i]==' ') k++;}q=l1+l2+l3-x-d-s-k;//其他字符cout<<"共有大写字母"<<d<<"个"<<"小写字母"<<x<<"个"<<"数字"<<s<<"个"<<"空格"<<k<<"个"<<"其他字符"<<q<<"个"<<endl;}分析:自定义函数需返回多个统计结果,可采用一个专门的数组存放统计结果,并将其作为函数参数,在被调函数中计数。