9.11 C语言基础-函数

题目:以下程序的正确运行结果是( )。(鲁科安全)

int f(int a);

int main(void)

{

    int a = 2,i;

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

printf("%4d", f(a));

}

int f(int a)

{

    int b = 0;

    static int c = 3;

b++;

c++;

    return (a+b+c);

}

A. 777 B. 7 10 13 C. 7 9 11 D. 7 8 9

答案:D

分析:第一次调用f()函数,a=2传值,函数内部b=0,c=3,b++得b=1,c++得c=4,返回a+b+c=7;第二次调用f()函数,a=2传值,因为b为局部变量,一次调用完后,内存释放,所以每次调用都重新定义并赋值,因为c是static修饰的静态局部变量,一次调用完后,内存不被释放,值保留,且只初始化一次,函数内部b=0,c=4,b++得b=1,c++得c=5,返回a+b+c=8;第三次调用f()函数,a=2传值,函数内部b=0,c=5,b++得b=1,c++得c=6,返回a+b+c=9;所以选D

题目:在一个被调用函数中,关于return语句使用的描述,( )是错误的 (软通动力)

A. 被调用函数中可以不用return语句

B. 被调用函数中可以使用多个return语句

C. 被调用函数中,如果有返回值,就一定要有return语句

D. 被调用函数中,一个return语句可以返回多个值给调用函数

答案:D

分析:被调用函数可以不用return语句,可以使用多个return语句,若有返回值,则一定要有return语句进行返回值,一个return语句只能返回一个值给调用函数

题目:以下程序的运行结果为( ) (鲁科安全)

#include <stdio.h>

#include <string.h>

int SubCount(char *dest, int count)

{

    strcpy(dest, "555");

    count++;

    return 0;

}

int main()

{

    int count = 3;

    char caBuf[8];

    SubCount(caBuf, count);

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

    return 0;

}

A. 8 B. 4 C. 3 D. 5

答案:C

分析:SubCount(caBuf, count);传参时,一个传递字符数组名,即数组首地址,一个是count的值,在SubCount函数内部,caBuf的数组进行字符串拷贝,注意因为count是值传递给函数形参,在函数内部形参的内存空间与外部count的内存空间不一样,所以被调用函数内形参的值变动不会影响外部参数的值,而传地址时,指针指向的内存空间是一致的,可以进行字符串拷贝,所以外部count的值不变,为3

题目:请问运行Test函数会有什么样的结果?(华辰泰尔)

char *GetMemory(void)

{

    char p[] = "hello world";

    return p;

}

void Test(void)

{

    char *str = NULL;

    str = GetMemory();

    printf(str);

}

答案:因为GetMemory内部定义字符数组,是一个局部数组,在出GetMemory函数时,这个数组的内存被释放,此时返回数组的首地址给str,此时str所指向的内存是未被定义的,在打印时会存在非法访问内存,段错误

题目:分析以下程序,写出运行结果并写出过程 (广域科技)

#include <stdio.h>

#include <stdlib.h>

void getalloc(char *p)

{

    p = (char *)malloc(100);

    strcpy(p, "hello world");

}

int main()

{

    char *str = NULL;

    getalloc(str);

    printf("%s\n",str);

    free(str);

    return 0;

}

答案:因为getalloc内部重新开辟动态内存空间,其地址被重新赋值给p,而p的内存空间与外部str的内存空间是不一样,所以重新赋值只会改变p开辟的内存值,不会影响外部str的内存值,所以strcpy对函数外部的str没有任何影响,此时str仍为空指针,进行输出操作时会存在错误,并且p指向的内存空间没有被free。

题目:下列程序的输出结果是________。(富士安全)

fun(int a, int b, int c)

{

    c = a*b;

}

void main()

{

    int c = 10;

    fun(2,3,++c);

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

}

答案:11

分析:c进行的是值传递,函数内部和外部c的内存空间不一致,fun内部运算结果不会影响外部c的值,++c后给c自增为11

题目:找错题,说明那里错了(恩易物联1,深圳元征信息科技)

void test1()

{

    char string[10];

    char *str1 = "0123456789";

    strcpy( string, str1 );

}

答案:因为string字符数组只有10个字节空间,而字符串常量有11占11字节大小,进行strcpy拷贝时会非法访问未被开辟的内存。

题目:下面的代码片段会输出__________ (飞音时代)

void test(void)

{

    char *p = NULL;

    strcpy(p, "hello");

    printf("%s", p);

}

答案:会报错,因为指针p为空指针,不指向任何内存空间,调用strcpy函数时,函数内部解引用会报错,所以程序错误。

题目:sizeof(str); 的值是多少? (21年中航安为)

void Func(char str[100])

{

sizeof(str);

}

答案:64位是8字节

分析:定义数组作为形参时,此时数组名相当于指针,64位下指针大小为8字节

题目:递归函数最终会结束,那么这个函数一定( );(北京信果科技)

A. 使用了局部变量

B. 有一个分支不调用自身

C. 使用了全局变量或者使用了一个或多个参数

答案:B

分析:递归函数存在限制条件,当满足限制条件时,肯定跳转到一个不调用自身的分支用于结束递归

题目:程序如下,程序执行后的输出结果是: (中科四平)

int f(int x, int y)

{

    return (y-x)*x;

}

void main()

{

    int a = 3,b=4,c=5,d;

    d=f(f(3,4),f(3,5));

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

}

答案:9

分析f(f(3,4),f(3,5))先计算f(3,5)返回值为6,再计算f(3,4)返回值为3,得到f(3,6)计算得到返回值为9

题目:请判断下面程序输出的值是多少? (信雅达)

int func(int a)

{

    static int b = 0;

    b+=a;

    return b;

}

int main(void)

{

    printf("%d %d\n", func(1)+func(3), func(5));

}

答案:15 9

分析:printf()参数时先计算fun(5),因为func内部b为静态局部变量,所以调用结束后b内存不会释放,值保留,且只初始化一次,func(5)返回值为5,b的值为5,再计算func(1)返回值为6,b的值为6,再计算func(3)返回值为9,b的值为9,所以func(1)+func(3)值为15,所以打印结果为15 9

题目:这段程序的输出是(________) (青岛汉泰)

void f1(int *, int);

void f2(int *, int);

void(*p[2]) (int *, int);   

main()

{

    int a;

    int b;

    p[0] = f1;

    p[1] = f2;

  a=3;

  b=5;

  p[0](&a, b);

    printf("%d\t %d\t", a, b);

    p[1](&a, b);

    printf("%d\t %d\t", a, b);

}

void f1(int * p, int q)

{

    int tmp;

    tmp = *p;

    *p = q;

    q = tmp;

}

void f2(int *p, int q)

{

    int tmp;

    tmp = *p;

    *p = q;

    q = tmp;

}

A. 5 5 5 5 B. 3 5 3 5 C. 5 3 5 3 D. 3 3 3 3

答案:A

分析:void(*p[2]) (int *, int);定义一个全局数组,数组有2个元素,每个元素是一个指针,指针指向一个int*和int参数,无返回值的函数, p[0] = f1;将f1函数名赋值给p[0],然后p[0](&a, b);调用f1函数,传参一个传地址,一个传值,所以a值改变为5,b值不变为5,同理调用f2时,a值改变为5,b值不变为5,选A

题目:有以下程序段, x=7执行后的值为 ( ) (杭州快越科技)

int fun(int x) {

int p;

if(x==0||x==1)

return(3);

    p=x-fun(x-2);

return p;

}

A. 0 B. 2 C. 5 D. 6

答案:x=7传值,p=7-fun(5),fun(5)=5-fun(3),fun(3)=3-fun(1),fun(1)=3,再逆回运算得,p=7-5=2,选B

题目:有以下函数,该函数的返回值是:( ) (山东信通电子)

char *fun(char *p)

{

    return p;

}

A. 无确切的值 B. 形参 p 中存放的地址值

C. 一个临时存储单元的地址 D. 形参 p 自身的地址值

答案:B,return p表示返回p中存储得地址值

题目:编写strcpy函数 (山东山大电力技有限公司)

已知strcpy 函数的原型是

char *strcpy(char *strDest,const char *strSrc);其中 strDest 是目的字符串,strSrc 是源字符串。

(1)、不调用 C 的字符串库函数,请编写函数 strcpy。

(2)、strcpy 能把 strSr 的内容复制到 strDest,为什么还有 char"类型的返回值?

(3)、strcpy 和 memcpy 的区别。

(1)char *strcpy(char *strDest,const char *strSrc){

                char *p=strDest;

                 while(*strSrc){

                        *strDest=*strSrc;

                        strDest++;strSrc++;

        }

                *strDest='\0';

                return p;

}

(2)char*类型返回值是返回目的字符串的起始地址

(3)strcpy只能对字符串进行拷贝,memcpy可以对其他类型的数据进行拷贝,根据传入的拷贝字节数限定拷贝的内容

题目:请实现一个函数,输入一个整数,输出该数二进制表示中的1的个数。例如:把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。(矩阵软件)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int num(int n);
int main(int argc, const char *argv[])
{
	int n;
	//提示输入一个整数
	printf("请输入一个整数:");
	scanf("%d",&n);
	printf("输入数二进制1的个数为%d\n",num(n));
	return 0;
}
//实现输入整数返回二进制中1的个数
//定义一个全局变量count,因为递归不影响count的值
int count=0;
int num(int n){
	/*while(n){
		if(n%2==1){
			count++;
		}
		n=n/2;
	}*///采用循环方式求解
	if(n<2){
		if(n==1){
			count++;
		}
	}else{
		if(n%2==1){
			count++;
		}	
		num(n/2);
	}//采用递归方式求解
	return count;
}

运行结果:

题目:请用编写递归算法计算fibinacci数列第1000位的值。斐波拉契数列为1,1,2,3,5,8,13,21,…… (北京凝思软件)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int fbnq(int n);
int main(int argc, const char *argv[])
{
	//请输入一个数
	int n;
	printf("请输入一个数:");
	scanf("%d",&n);
	printf("%d",fbnq(n));
	return 0;
}
//实现第n位fbnq数的值
int fbnq(int n){
	//采用递归实现,当输入数很大时,递归时间会非常长
	/*if(n==1||n==2){
		return 1;
	}else{
		return fbnq(n-1)+fbnq(n-2);
	}*/
	//采用循环求解
	if(n==1||n==2){
		return 1;
	}else{
		int a=1,b=1,c=0;
		for(int i=3;i<=n;i++){
			c=a+b;
			a=b;
			b=c;
		}
		return c;
	}
}

运行结果:

题目:用 C 语言写一个递归算法求 N!(华辰泰尔)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int fac(int n);
int main(int argc, const char *argv[])
{
	int n;
	//请输入一个数
	printf("请输入一个数:");
	scanf("%d",&n);
	printf("该数的阶乘为%d",fac(n));
	return 0;
}
int fac(int n){
	if(n==1){
		return 1;
	}else{
		return n*fac(n-1);//n!等于n*(n-1)!
	}

}

运算结果:

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值