C语言定义的五大内存空间
1.栈区 (stack):(局部变量,形参)
FILO (先入后出),函数的形参和局部变量,存放在这个区。由编译器自动分配,自动释放。
2.堆区(heap):(申请空间)
这个区,由程序员申请后使用,使用完了,需要手动释放。否则,会造成内存泄漏。
一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表
(申请空间的函数有:malloc --- free ; new --- delete )
3.全局区(静态区)(static):(全局变量和静态变量)
全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在
相邻的另一块区域。程序结束后由系统释放。
4.文字常量区:(存放常量)
常量字符串就是放在这里的,直到程序结束后由系统释放。
char a='9';
char a[]="zmx";
char *a[]={""};
12=92;
5.代码区:
存放函数体的二进制代码
相关函数:(在指针部分,进行详细讲解)
void *malloc(size_t size);
void free(void *p);
变量的作用域和生存期
从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量。从另一个角度,从变量值存在的作时间(即生存期)角度来分,可以分
为静态存储方式和动态存储方式。
1.作用域(Scope):起作用的代码范围
根据作用域不同,变量分为局部变量和全局变量
只有在变量的作用域范围内才能访问变量
不同作用域的局部变量可以同名,不冲突
(1)局部变量:
(2)全局变量:
用static关键字定义的全局变量称为静态全局变量。
用extern关键字定义的全局变量称为外部变量
关于局部变量的作用域还要说明以下几点:
1) 主函数中定义的局部变量也只能在主函数中使用,不能在其它函数中使用。同时,主函数中也不能使用其它函数中定义的变量。
因为主函数也是一个函数,它与其它函数是平行关系。这一点是与其它语言不同的,应予以注意。
2) 形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。
3) 允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。
4) 在复合语句中也可定义变量,其作用域只在复合语句范围内。
5)如果同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即它不起作用。
从另一个角度,从变量值存在的作时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式。
用户存储空间可以分为三个部分:
1) 程序区;
2) 静态存储区;
3) 动态存储区;
对静态局部变量的说明:
1) 静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属
于动态存储类别,占动态存储空间,函数调用结束后立即释放。
2) 静态局部变量在编译时赋初值,即只赋初值一次;而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当
于执行一次赋值语句。
3) 如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。而
对自动变量来说,如果不赋初值则它的值是一个不确定的值。
register变量(寄存器变量)
为了提高效率,C语言允许将局部变量的值放在CPU中的寄存器中,这种变量叫“寄存器变量”,用关键字register作声明。
说明:
1) 只有局部自动变量和形式参数可以作为寄存器变量;
2) 一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量;
3) 局部静态变量不能定义为寄存器变量。
自定义函数
函数的定义
函数的声明
函数的调用
在调用一个函数时,程序执行流程会跳转到该函数内部去执行,并且会将实参的值传递给形参变量(值传递),即用实参初始化形参变量,当该函
数执行结束返回后,程序执行流程会回到函数调用处,继续往下执行
虚实结合:在调用函数时,形参变量才被定义(创建,分配存储空间),并接收实参传递过来的值(即被实参初始化),在函数返回后,形参变量
将被销毁(释放其占用的内存空间),即不复存在
函数可以嵌套调用,但不能嵌套定义
主函数和普通函数的区别:
1.主函数是由操作系统亲自调用,而普通函数是被主函数直接或间接调用
2.主函数返回会导致进程结束,而普通函数返回没有这个影响力
递归函数:自己调用自己的函数
编写递归函数要把握两点:
1.递推关系
2.递归结束条件
包含头文件时,如果使用双引号,那么编译器会优先去当前工程目录下搜索;如果使用尖括号,那么编译器则优先去系统头文件目录
(比如/usr/include等)下搜索
编译:Compile
编译器:Compiler
链接:Link
链接器:Linker
将工程目录下的每个源文件都编译(通过编译器)成对应的目标文件(Linux平台为.o,是二进制文件,但无法执行),然后将所有目标文
件和库文件链接在一起(通过链接器)构成最终的可执行文件
注意:每个源文件都是单独编译的
shell编程基础
shell脚本,是包含若干个Linux命令的文件,后缀名是.sh。可以使用vi file.sh,创建 file.sh 文件。
执行shell程序文件有三种方法:
(1)sh shell_file
(2)source shell_file
(3)./shell_file
在编写shell时,第一行一般要指明系统需要哪种shell,并解释shell程序。如:
#!/bin/bash (我们学这种shell)
#!/bin/csh
#!/bin/tcsh
Bash shell 结构
(1)shbang 行:
是脚本的第一行,由#!和shell的完整路径组成。它通知内核使用哪种shell解释脚本中的行。
(2)注释:
由# 后跟描述性的说明组成,位置任意。
(3)通配符:
(1) * : 匹配任意长度的字符串 rm *.c
(2) ? : 匹配一个长度的字符串 vi 1_struc?.cpp
(3)[...] :匹配指定的字符 rm [12345].c
(4)[.-.] :匹配一个范围的字符串 rm [1-5].c
(4) 显示输出:
echo 命令,用于向屏幕显示输出
(5)局部变量(declare函数)
(6)全局变量(环境变量)(export命令)
(7)提取变量值 ($)
(8)读取用户输入
(9)参数
(a)数组
(b)命令替换
(c)算数运算
(d)运算符
(e)条件语句;循环语句;
(f)函数
shell中的变量
用户自定义变量在Linux系统支持的shell中,都可以用赋值符号“=”给变量赋值,所赋的值要用引号括起来。如果需要使用这个变
量,则在变量前面加一个“$”
1.栈区 (stack):(局部变量,形参)
FILO (先入后出),函数的形参和局部变量,存放在这个区。由编译器自动分配,自动释放。
2.堆区(heap):(申请空间)
这个区,由程序员申请后使用,使用完了,需要手动释放。否则,会造成内存泄漏。
一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表
(申请空间的函数有:malloc --- free ; new --- delete )
3.全局区(静态区)(static):(全局变量和静态变量)
全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在
相邻的另一块区域。程序结束后由系统释放。
4.文字常量区:(存放常量)
常量字符串就是放在这里的,直到程序结束后由系统释放。
char a='9';
char a[]="zmx";
char *a[]={""};
12=92;
5.代码区:
存放函数体的二进制代码
相关函数:(在指针部分,进行详细讲解)
void *malloc(size_t size);
void free(void *p);
变量的作用域和生存期
从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量。从另一个角度,从变量值存在的作时间(即生存期)角度来分,可以分
为静态存储方式和动态存储方式。
1.作用域(Scope):起作用的代码范围
根据作用域不同,变量分为局部变量和全局变量
只有在变量的作用域范围内才能访问变量
不同作用域的局部变量可以同名,不冲突
(1)局部变量:
(2)全局变量:
用static关键字定义的全局变量称为静态全局变量。
用extern关键字定义的全局变量称为外部变量
关于局部变量的作用域还要说明以下几点:
1) 主函数中定义的局部变量也只能在主函数中使用,不能在其它函数中使用。同时,主函数中也不能使用其它函数中定义的变量。
因为主函数也是一个函数,它与其它函数是平行关系。这一点是与其它语言不同的,应予以注意。
2) 形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。
3) 允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。
4) 在复合语句中也可定义变量,其作用域只在复合语句范围内。
5)如果同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即它不起作用。
从另一个角度,从变量值存在的作时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式。
用户存储空间可以分为三个部分:
1) 程序区;
2) 静态存储区;
3) 动态存储区;
对静态局部变量的说明:
1) 静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属
于动态存储类别,占动态存储空间,函数调用结束后立即释放。
2) 静态局部变量在编译时赋初值,即只赋初值一次;而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当
于执行一次赋值语句。
3) 如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。而
对自动变量来说,如果不赋初值则它的值是一个不确定的值。
register变量(寄存器变量)
为了提高效率,C语言允许将局部变量的值放在CPU中的寄存器中,这种变量叫“寄存器变量”,用关键字register作声明。
说明:
1) 只有局部自动变量和形式参数可以作为寄存器变量;
2) 一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量;
3) 局部静态变量不能定义为寄存器变量。
自定义函数
函数的定义
函数的声明
函数的调用
在调用一个函数时,程序执行流程会跳转到该函数内部去执行,并且会将实参的值传递给形参变量(值传递),即用实参初始化形参变量,当该函
数执行结束返回后,程序执行流程会回到函数调用处,继续往下执行
虚实结合:在调用函数时,形参变量才被定义(创建,分配存储空间),并接收实参传递过来的值(即被实参初始化),在函数返回后,形参变量
将被销毁(释放其占用的内存空间),即不复存在
函数可以嵌套调用,但不能嵌套定义
主函数和普通函数的区别:
1.主函数是由操作系统亲自调用,而普通函数是被主函数直接或间接调用
2.主函数返回会导致进程结束,而普通函数返回没有这个影响力
递归函数:自己调用自己的函数
编写递归函数要把握两点:
1.递推关系
2.递归结束条件
包含头文件时,如果使用双引号,那么编译器会优先去当前工程目录下搜索;如果使用尖括号,那么编译器则优先去系统头文件目录
(比如/usr/include等)下搜索
编译:Compile
编译器:Compiler
链接:Link
链接器:Linker
将工程目录下的每个源文件都编译(通过编译器)成对应的目标文件(Linux平台为.o,是二进制文件,但无法执行),然后将所有目标文
件和库文件链接在一起(通过链接器)构成最终的可执行文件
注意:每个源文件都是单独编译的
shell编程基础
shell脚本,是包含若干个Linux命令的文件,后缀名是.sh。可以使用vi file.sh,创建 file.sh 文件。
执行shell程序文件有三种方法:
(1)sh shell_file
(2)source shell_file
(3)./shell_file
在编写shell时,第一行一般要指明系统需要哪种shell,并解释shell程序。如:
#!/bin/bash (我们学这种shell)
#!/bin/csh
#!/bin/tcsh
Bash shell 结构
(1)shbang 行:
是脚本的第一行,由#!和shell的完整路径组成。它通知内核使用哪种shell解释脚本中的行。
(2)注释:
由# 后跟描述性的说明组成,位置任意。
(3)通配符:
(1) * : 匹配任意长度的字符串 rm *.c
(2) ? : 匹配一个长度的字符串 vi 1_struc?.cpp
(3)[...] :匹配指定的字符 rm [12345].c
(4)[.-.] :匹配一个范围的字符串 rm [1-5].c
(4) 显示输出:
echo 命令,用于向屏幕显示输出
(5)局部变量(declare函数)
(6)全局变量(环境变量)(export命令)
(7)提取变量值 ($)
(8)读取用户输入
(9)参数
(a)数组
(b)命令替换
(c)算数运算
(d)运算符
(e)条件语句;循环语句;
(f)函数
shell中的变量
用户自定义变量在Linux系统支持的shell中,都可以用赋值符号“=”给变量赋值,所赋的值要用引号括起来。如果需要使用这个变
量,则在变量前面加一个“$”