自学嵌入式 day12-C语言-第8章 函数

8.7 整形二维数组作为参数调用

(1)需要两个参数:数组首元素地址、数组行数。

(2)引用时列数不可省略

①遍历函数

void printArray(int a[][4],int rows)
{
    int i,j;
    int cols = sizeof(a[0]) / sizeof(a[0][0]);
    for(i = 0;i < rows;++i)
    {
        for(j = 0;j < cols;++j)
        {
            printf("%2d ",a[i][j]);
        }
        puts("");
    }
}

②镜像函数

void reverse2D(int a[][4],int rows)
{
    int i,j;
    int cols = sizeof(a[0]) / sizeof(a[0][0]);
    for(i = 0;i < rows;++i)
    {
        for(j = 0;j < cols / 2;++j)
        {
            int t;
            t = a[i][j];
            a[i][j] = a[i][cols - j - 1];
            a[i][cols - j - 1] = t;
        }
    }
}

③求二维数组每一行的平均值

void advArray(int a[][4],int b[],int rows)
{
    int i,j;
    int cols = sizeof(a[0]) / sizeof(a[0][0]);
    for(i = 0;i < rows;++i)
    {
        int t = 0;
        for(j = 0;j < cols;++j)
        {
            t += a[i][j];
        }
        b[i] = t / cols;
        printf("%d\n",b[i]);
    }
}

8.8字符型数组

void putsString(char s[][100],int rows)
{
    int i = 0;
    for(i = 0;i < rows;++i)
    {
        puts(s[i]);
    }
}

8.9 局部变量和全局变量(标识符的作用域与可见性)
1.作用域:

(1)局部作用域:定义在“{ ... }”中,范围为自身被定义到最近的“}”符号,这种定义的的变量为局部变量。包括函数的形参。

(2)全局作用域:定义在“{ ... }”外,范围为自身被定义到本文件结束,这种定义的变量为全局变量。所有的函数名都是全局作用域。

注;

全局变量传参:(1)函数耦合性过高;

                         (2)定义未被初始化时值为0;

2. 可见性:当标识符运行到一点时,是否可以对某个标识符进行访问或使用,即为该点的可见性

注:标识符的使用:

(1)标识符必须先定义再引用

(2)在同一作用域中不可定义同名标识符

(3)在没有包含关系的不同作用域中定义的同名标识符互不影响

(4)在两个或多个具有包含关系的作用域中定义的同名标识符,外层标识符在内层不可见

8.10 变量生存期:从变量开空间到被销毁的期间

1. 静态生存期:变量的生存期与程序的运行周期相同(所有的全局变量都具有静态生存期)

2. 动态生存期:程序运行中会不断销毁、开空间(所有的局部变量都具有动态生存期)

8.11 部分关键字的使用

 1.static:

(1)s_i为局部变量:

static int s_i ;//将局部变量s_i的动态生存期改为静态,但只有局部作用域

(2)s_i为全局变量:

static int s_i;//将s_i的作用范围限制在该程序的文件下

2. quto :表示空间的开启和销毁时自动的

3.register:表示寄存器变量,建议编译器将变量保存在cpu中,以提高读取效率

注:考点;

reister int i;

int *p;

p = &i;

        编译报错,原因为变量i可能在寄存器中,不可被寻址

4. eatern:声明(可声明在头文件中),可声明全局变量

拓展:

(1)Linux操作指令:

        ①:vsp abc.c ---建立新文件

        ②:set mouse==a ---解除鼠标限制

        ③:sp fun.c ---创建头文件(头文件不参与编译)

练习:

1.打印某年某月的日历

#include<stdio.h>

void printCalendar(void)
{
    puts("Sun Mon Tue Wed Thu Fir Sat ");
}

int isLeapyear(int year)
{
    if(year % 4 == 0 && year % 100 != 0 ||year % 400 == 0)
    {
        return 1;
    }
    return -1;
}


int dayOfTheMonth(int year,int month)
{
    int j = month,day;
    
        if(1 == j || 3 == j || 5 == j || 7 == j || 8 == j || 10 == j || 12 == j)
        {
            day =31;
        }
        else if(2 == j || 4 == j || 6 == j || 9 == j || 11 == j)
        {
            day =30;
        }
        else if (2 == j && isLeapyear(year))
        {
            day = 29;
        }
        else 
        {
            day =28;
        }
    
    return day;
}

int dayAfter1900(int year,int month)
{
    int i,day = 0;
    for(i = 1900;i < year;++i)
    {
        day +=365;
        if(isLeapyear(i))
        {
            day +=1;
        }
    }
        for(i = 1;i <= month;++i)
        {
        day += dayOfTheMonth(year,i);
        }
    
    return day;
}


int weekOftheFirstDay(int year,int month)
{
    int day = dayAfter1900(year,month);
    int dayofweek = (day + 1) % 7;
    return dayofweek;
}


int main(void)
{
    int year = 2025,month = 4;
    printCalendar();
    int i ;
    for(i = 0;i < weekOftheFirstDay(year,month);++i)
    {
        printf("    ");
    }
    int day = dayOfTheMonth(year,month);
    int t = weekOftheFirstDay(year,month);
    for(i = 1;i <= day;++i)
    {
        printf("%3d ",i);
        ++t;
        if(t % 7 == 0)
        {
            printf("\n");
        }
    }
    puts("");
    
    return 0;

}

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值