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;}
结果: