封装一个函数,完成传入两个数值,获得这两个数值的最大公约数和最小公倍数
#include<stdio.h>
int qiuzhi(int *yue, int *bei)
{
int x = *yue, y = *bei;
int i =0, tmp = 0, m = 0, n = 0;
if (x > y)
{tmp = x;
x = y;
y = tmp;}
for(i = x; i>0 ;i--)
{
if((0 == x % i)&&(0 == y %i))
{m = i;break;}
}
for(i = y; ; i++)
{
if((0 == i%x)&&(0 == i%y))
{n = i;break;}
}
*yue = m;
*bei = n;
return 0;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d%d",&a,&b);
qiuzhi(&a,&b);
printf("gongyueshu=%d\ngongbeishu=%d\n",a,b);
return 0;
}
求出数组a[N][N]中主对角线最大值和辅对角线最小值
#include<stdio.h>
# define N 5
int main()
{
int i = 0, j =0;
int min1 = 0,min2 = 0;
int a[N][N] = {0};
int tmp = 0;
for(j = 0; j < N; j++)
{
for(i = 0; i < N; i++)
{scanf("%d",&a[j][i]);}
}
for(i = 0, min1 = a[i][i], min2 = a[i][4-i]; i < N; i++)
{
if(min1 > a[i][i])
{
min1 = a[i][i];
}
if(min2 > a[i][4-i])
{
min2 = a[i][4-i];
}
}
printf("zhumin=%d\n,fumin=%d\n",min1,min2);
return 0;
}
练习:封装一个函数获得数组中的最大值和最小值
#include<stdio.h>
int getminmax(int a[], int len, int *x, int *y)
{
int m = a[0];
int n = a[0];
for (int i = 1; i <len; i++)
{
if(m < a[i]) m = a[i];
if(n > a[i]) n = a[i];
}
*x = m; *y = n;
return 0;
}
int main()
{
int a[5] = {32,17,51,64,37};
int max = 0;
int min = 0;
getminmax(a, 5, &max, &min);
printf("max = %d\nmin = %d\n",max,min);
return 0;
}
1.宏
1.宏是代码的替换,中间不进行任何数据计算的操作
2.能加括号就加括号,不好吝啬小括号
不带参宏
带参宏(宏函数)
带参宏与函数的区别:
1.函数有参数类型、返回值、调用的概念
2.带参宏只是代码的替换
3.带参宏会让程序代码体积增大
4.函数不会让程序代码体积增大
5.函数传参会占用资源开销,增大程序运行时间
6.带参宏没有传参调用的过程,程序运行速度更快
带参宏:
用于封装比较简单的模块代码
2.指针
1.指针: int *p = Null 定义一个指针变量 p *p是p指向的地址目标的值 而&是取目标的地址
注意:p 是一个指针(地址)
1.代码更加简洁高效
2.指针可以直接访问内存
3.指针可以操作硬件
2.概念:
1.地址:用来区分内存中不同字节的编号
2.指针:指针就是地址,地址就是指针,指针多了指向的概念
3.指针变量:是一个变量, 变量里面存放了一个指针(地址), 称为指针变量,
使用指针变量等价于使用其内部存放的指针,所以我们有时也把指针变量简称为指针
3.运算符:
&:只能操作左值(变量)
*:只能操作指针类型
4.指针变量的定义:
int *p, *q;
野指针:未经初始化的指针,指向已经被释放过空间的指针称为野指针
指针一定记得初始化
空指针:NULL 0x0, 指向内存地址为0x0的指针
5.指针的常见操作
6.指针的算数运算
7.指针作为函数参数:
1.复制传递(赋值传递)
实参将值传递给形参,形参是实参的副本,形参改变不会影响实参
函数体内想使用函数体外部变量值的时候使用复制传递
2.地址传递
实参地址传递给形参,形参就是实参的指针,可以通过对形参取*改变实参的值
函数体内想修改函数体外部变量值的时候使用地址传递