函数的练习题

局部变量的作用域只在函数体内,局部变量的生存期为函数调用时至函数调用结束。

函数调用方式

调用函数的定义形式
函数名(实参表)

#include <stdio.h>

f()
{
    int x = 1;
    x = x + 2;
    printf("%d",x);
}
int main()
{
    f();
    f();
}

错误:缺少类型显示

传值调用

#include <stdio.h>

int fun(int m,int n)
{
    m = n;
    n = m;
}
void main()
{
    int x = 5;
    int y = 7;
    printf("%d %d",x,y);
}

fun 必须有返回值
fun是传值调用,不会影响主函数中x 和 y 的值。

#include <stdio.h>

void f(char *s)
{
    s = "Hello World! ";
}
void main()
{
    char s[] = "Hello C! ";
    f(s);
    printf("%s",s);
}

传址调用
字符数组中的内容会被改变为”Hello World!“

传址调用

#include <stdio.h>

void fun(int *m, int *n)
{
    *m = *n;
    *n = *m;
}
void main()
{
    int x = 5, y = 7;
    fun(&x, &y);
    printf("%d %d",x,y);
}

fun()是传址调用,因此形参值的改变会影响实参的值。

数组作为实参传递给函数,求累加和

#include <stdio.h>

int f(int a[])
{
    int i, s = 0;
    for (i = 0; i < 5; i++)
        s = s + a[i];
    printf("%d",s);
}
void main()
{
    int a[] = { 1,3,5,7,9 };
    f(a);
}

f 必须返回值
数组作为实参传递给f()函数,计算其累加和后输出

交换两个数的值

#include <stdio.h>

void f(int *a, int *b)
{
    int t;
    t = *a;
    *a = *b;
    *b = t;
}
void main()
{
    int x = 3,y= 4;
    f(&x, &y);
    printf("%d %d",x,y);
}
4 3 

将x y的地址传作为实参递给函数f(),在f()函数中交换了这两个数的值。

求连乘

#include <stdio.h>

void f(int a[])
{
    int s = 1, i;
    for (i = 0; i < 5; i++)
        s = s*a[i];
    printf("%d",s);
}
void main()
{
    int x[5] = { 1,2,3,4,5 };
    f(x);
}
120

将数组x作为参数传递给函数f(),然后在该函数中计算每个元素的乘积后输出。

保存变量中,然后输出变量中的值

#include <stdio.h>

int s(int x)
{
    x = x * 2;
    return x;
}
void main()
{
    int a = 10, b;
    b = s(a);
    printf("%d %d",a,b);
}
10 20 

通过for循环求累加和保存至变量中,然后输出变量s

#include <stdio.h>

int f(int x[])
{
    int i;
    for (i = 0; i < 4; i++)
    {
        x[i] = x[i] + 5;
        printf("%d",x[i]);
    }
    return x[i];
}
void main()
{
    int x[4] = { 1,2,3,4 };
    int i;
    for (i = 0; i < 4; i++)
        printf("%d",x[i]);
    printf("\n");
    f(x);
    for (i = 0; i < 4; i++)
        printf("%d",x[i]);
}
1234
6789 6789
#include <stdio.h>

void f()
{
    static int a = 0;
    a = a + 2;
    printf("%d",a);
}
void main()
{
    f();
    f();
    f();
}
246

变量的类型为静态类型,因此变量a会始终存在,直到程序结束为止。

递增运算符

#include <stdio.h>

int x = 1;
void f()
{
    int y;
    y = x++;
    printf("%d",y);
}
void main()
{
    f();
    printf("%d",x);
}
12

x 为全局变量,函数f()中x的值加了1,因此x的值变化为2

全局变量的交换两个数的值

#include <stdio.h>

int a = 10, b = 20;
void change(int x, int y)
{
    int t;
    t = x;
    x = y;
    y= t;
}
void main()
{
    int c = 30, d = 40;
    change(a, b);
    change(c, d);
    printf("%d %d %d %d",a,b,c,d);
}
10 20 30 40 

变量a 和b为全局变量,变量c和d为全局变量,因此调用函数之后,全局变量的值会改变,局部变量的值不会改变,为什么?

全局变量和保存

#include <stdio.h>

int s = 5;
void fun(int x)
{
    s = s - x;
}
void main()
{
    int i = 6;
    fun(i);
    printf("%d %d",i,s);
}
6 -1

本例中fun函数中将s-x的值赋值给变量s,

后置递减运算符的使用

#include <stdio.h>

int main()
{
    int t, a, b = 4;
    a = 2 * b - 1;
    t = a + b--;
    printf("%d %d %d",a,b,t);
}
7 3 11 

将程序2*b-1的值赋值给变量a,将a+b–的值赋给变量t,最后输出变量,a,b,和t的值

返回值的结果

#include <stdio.h>

int f(int a, int b)
{
    int c = 5;
    return (a+b-5);
}
int main()
{
    int x = 7, y = 6;
    int z = f(x,y);
    printf("%d",z);
}
8

fun 的功能为返回a+b-5的值。

#include <stdio.h>

void f(int x,int *y)
{
    x = 5;
    *y = *y + x;
}
void main()
{
    int x = 3, y = 4;
    f(x, &y);
    printf("%d %d",x,y);
}
3 9

返回值的表达式中的后置运算符

#include <stdio.h>

int f(int x)
{
    return x++;
}
void main()
{
    int a = 5, s = 0;
    s = s + f(a);
    printf("%d %d",a,s);
}
5  5

将变量a传递给函数f()返回x++的值。输出变量a 和 s 的值。

数组元素的前置运算符

#include <stdio.h>

void fun(int a[], int n)
{
    int i;
    for (i = 0; i < n; i++)
        printf("%d",++a[i]);
}
void main()
{
    int x[] = { 1,2,3,4,5,6,7 };
    fun(x, 5);
}
23456

f()函数将数组x中的每个元素都加1,然后进行输出。

看不懂此题

#include <stdio.h>

void fun(char s[], int n)
{
    int i;
    for (i = n - 1; i >= 0; i--)
        s[i] = s[i + 1];
    printf("%s",s);
}
int main()
{
    char s[50] = "abcdefgh";
    int n = 6;
    fun(s, n);
}

n的值为6,将字符数组s 和n 传递给函数,在函数中fun中进行相应的操作再输出。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值