函数的练习题

时间:2023-02-23 11:40:12

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

函数调用方式

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

#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中进行相应的操作再输出。