一维字符型数组做函数参数
因为处理的是字符串数据,字符串操作的依据,主要看结束标志'\0'而不是数组长度
二维数组做函数参数
总结:
形参 —— 二维数组形式 + 行数
实参 —— 数组名 + 行数
练习
数组的插入排序
void insertStr(char s[][10],int row)
{
int i,j;
char temp[10];
for(i = 1;i < row;i++)
{
strcpy(temp,s[i]);
j = i;
while(j > 0 && strcmp(temp,s[j-1]) < 0)
{
strcpy(s[j],s[j-1]);
j--;
}
strcpy(s[j],temp);
}
}
strlen,strcpy,strcat,strcmp
在不调用库函数的情况下实现strlen,strcpy,strcat,strcmp四个函数的功能
int Strlen(char s[])
{
int i=0;
while(s[i] != '\0')
{
i++;
}
return i;
}
void Strcpy(char dest[],char src[])
{
int i=0;
while(src[i] != '\0')
{
dest[i] = src[i];
i++;
}
dest[i] = '\0';
}
void Strcat(char dest[],char src[])
{
int i=0,j=0;
while(dest[i] != '\0')
{
i++;
}
while(src[j] != '\0')
{
dest[i] = src[j];
i++;
j++;
}
dest[i] = '\0';
}
int Strcmp(char s1[],char s2[])
{
int i = 0;
while(s1[i] == s2[i] && s1[i] != '0' && s2[i] != '\0')
{
i++;
}
i = s1[i] -s2[i];
return i;
}
二维字符型数组做函数参数
做函数参数与二维整形数组 使用方式相同
注意:1.不要和一维字符型数组传参搞混
一维字符型数组,主要用来存放字符串数据,而字符串数据有结束标志('\0')故,传参是,不需要串长度
2.二维字符型数组,用来存储多个字符串
要操作时,往往都是操作多个字符串,而多个字符串没有所谓的结束标志。看的是数组长度(行数)
标识符的作用域与可见性的问题
作用域:
名字作用的范围
可见性:
程序运行到某一个位置,哪些名字可以被使用(被看见)
作用域:
局部作用域
{
} //花括号范围内 就叫局部作用域
在局部作用域定义的变量——局部变量
在全局作用域定义的变量——全局变量
全局作用域
不在任何一个花括号范围之内
标识符的可见性规则
1.先定义后使用
2.同一个作用域中,不能有同名标识符
3.在不同作用域,同名标识符之间不会互相影响
4.如果是不同的作用域
但是作用域之间存在嵌套关系,则内层作用域的同名标识符会屏蔽外层作用域的同名标识符(就近原则)
空间角度
局部变量
特点:局部变量空间一般都开在栈上
如果不初始化,局部变量在的值是随机值(垃圾值)
全局变量
特点:全局变量空间开在全局区
如果不初始化,全局变量会默认初始化为0
时间角度
生命周期
int a; //什么时候a的空间被开辟,什么是a的空间被销毁
局部变量的生命周期
从程序运行到定义处开始存在,到程序运行到它的作用范围结束时销毁
全局变量的生命周期
从程序开始运行时就存在了,直到整个程序运行结束时销毁
注意:全局变量和静态变量,不能用“变量”进行初始化
存储类别的关键字:
auto //表示它是一个自动变量(局部变量)--- 自动申请 自动释放
static //修饰局部变量 此时会被放在全局区(静态区)
//此时局部变量的生命周期被延长
//注意:
1.static修饰局部变量 --只会被初始化一次 2.static修饰的变量 -- 具有继承性 3.static修饰的变量 -- 只能用常量初始化
register //表示把变量存储在寄存器
//register修饰的变量不能做&(取地址)
extern //表示变量是存在外部的,不在当前文件中
//只能声明全局变量
//static修饰全局变量,表示限定全局变量的作用域为本文件,别的文件不能通过extern来声明使用 用途:保护私有数据,防止被引用
修饰函数//声明函数在别处定义的 static修饰函数与修饰全局变量作用相同, 限定作用域为本文件,别的文件不能通过extern来声明使用
[存储类别] 类型 变量名