一、数组作为函数参数
1.二维数组作为函数参数传递,行数无法直接使用,可以在主函数中写好传递过去,列数必
须写死
2.数组名可以作为函数参数,此时形参应当用数组名或用指针变量
3.实参数组与形参数组类型应一致
4.数组名作为函数实参时,不是把数组元素的值传递给形参,而是把实参数组的首元素的地址
传递给形参数组
二、标识符的作用域和可见性问题
1. 作用域:标识符生存的范围
局部作用域:在{}里,局部变量,从定义生效开始到花括号结束;函数形参也具有局部作用域
全局作用域:在{}外,全局变量(g_a),从定义生效开始到本文件结束;
2.可见性:程序在运行到某一点时是否可以对标识符进行访问
1) 标识符必须先定义再使用
2) 在同一作用域中不得定义同名标识符
3) 在没有包含关系的不同作用域中定义同名标识符互不影响
4) 在两个或多个具有包含关系的作用域中定义的同名标识符,外层标识符在内层不可见(就
近原则)
三、全局变量和局部变量
1.全局变量作用:实现函数的传参
2.全局变量在静态区或全局区,没有对其初始化,在开辟空间自动清零
3.局部变量在栈区,没有对其初始化,直接打印时值为随机值
四、变量的生存期
1.静态生存期:这个变量的生存期和程序运行周期相同;静态生存期为其包括全局变量或静
态局部变量static int s_i(把s_i的空间由动态改为静态,在main函数第一条语句之前已经开好
空间了,有静态生存期,但是有局部作用域)
2.动态生存期:局部变量具有动态生存期;在栈区就具有动态生存期变量的存储类别划分
五、变量的存储类别
1.auto变量(自动型存储)
局部变量前,默认时auto,表示该变量的开辟、销毁是自动的;将变量存放在栈区中
2.static(静态存储)
1)静态变量,在局部变量前使用,把局部变量的生存期变为静态生存期;
2)在全局变量或者函数前加stadic不是为了改静态生存期,而是限制这个变量或者函数只
在、当前.c文件使用,其他文件一概不能使用
3.register(寄存器存储)
在定义一个变量前可加register,这这个变量就被称为寄存器,为了提高对变量的读写度;
考点:
regist int i;
int *p;
p=&i,
会导致编译报错,register定义的变量是不可被寻址的
4.extern(外部存储)
声明一个变量是外部存储的变量/函数
“:vsp 文件名.c” 左右分屏
“:sp 文件名.c” 上下分屏
若在main.c 中调用fun.c,编译时 gcc main.c fun.c
头文件只声明,不放定义/函数
在fun.h中声明 extern int add(int a,int b),在main.c中写#include“fun.h”
:set mouse = a 鼠标左右切换
五、例题
1.求边框值求和
int sumOfArray2D(int a[][4],int rows)
{
int cols = sizeof(a[0]) / sizeof(a[0][0]);
int i,j;
int sum = 0;
for(i = 0;i < rows;++i)
{
for(j = 0;j < cols;++j)
{
if(0 == i || 0 == j || rows - 1 == i || cols - 1 == j)
{
sum += a[i][j];
}
}
}
return sum;
}
2.二维数组镜像翻转
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)
{
reverse(a[i],cols);
}
}
void reverse(int a[],int len)
{
int i;
for(i = 0;i < len /2;++i)
{
int t = a[i];
a[i] = a[len - i -1];
a[len - i -1] = t;
}
}
3.二维数组求最大值
void maxOfStrings(char s[][100],int rows,char max[])
{
int i = 0;
strcpy(max,s[0]);
for(i = 1;i < rows;++i)
{
if(strcmp(max,s[i]) < 0)
{
strcpy(max,s[i]);
}
}
}
4.二维数组的逆序
void reverseStrings(char s[][100],int rows)
{
int i;
for(i = 0;i < rows / 2;++i)
{
char t[100];
strcpy(t,s[i]);
strcpy(s[i],s[rows - i -1]);
strcpy(s[rows - i - 1],t);
}
}
5.二维数组的排序
void sortStrings(char s[][100],int rows)
{
int i,j;
for(i = 0;i < rows - 1;++i)
{
for(j = i + 1;j < rows;++j)
{
if(strcmp(s[i],s[j]) > 0)
{
char t[100];
strcpy(t,s[i]);
strcpy(s[i],s[j]);
strcpy(s[j],t);
}
}
}
}
6.二维数组的查找
nt binaryFindStrings(char s[][100],int rows,char n[])
{
int begin = 0;
int end = rows - 1;
int mid;
while(begin <= end)
{
mid = (begin + end) / 2;
int ret = strcmp(s[mid],n);
if(ret > 0)
{
end = mid - 1;
}
else if(ret < 0)
{
begin = mid + 1;
}
else
{
return mid;
}
}
return -1;
}