全局变量 global variable
|--文件作用域 file scope
局部变量 local variable
|--函数作用域 function scope
|--块作用域 block scope
|--函数原型作用域 function prototype scope
存储期 storage duration
|--静态存储期 static storage duration 对变量分配固定的存储空间
|--动态存储期 dynamic storage duration 对变量动态的分配存储空间
内存分配划分:
|--程序区 存放代码
|--静态存储区 存放全局变量、静态变量 程序开始分配,程序结束释放
|--动态存储区 栈 存放局部变量 函数开始分配,函数结束释放
堆 存放new出来的东西
存储类别 storage class
|--自动 auto
|--寄存器 register
|--静态 static
|--外部 extern
自动变量 auto variable
auto int b,c=3; 等价于 int b,c=3;
寄存器变量
register int i,f=1; //建议性,非强制性 了解即可
static
|--静态局部变量 static local variable
函数内可见,函数外隐藏,存放在静态存储区
在函数编译时已经赋初值
|--静态外部变量
某些全局变量仅限于本文件使用
extern 仅用于声明
|--在一个文件内声明全局变量
void main()
{
extern int a,b; //提前引用声明
}
int a=15, b=-7; //a b 为全局变量
//此方法等同于把全局变量放在所有引用它的函数之前(推荐)
|--在多文件程序中声明外部变量
file1 file2.cpp
extern int a,b; int a=3, b=4;
让file1可以访问file2的变量
定义:需要建立存储空间 int a;
声明:不需建立存储空间 extern int a;
内部函数:
只能在本文件使用的函数
staitc 类型标识符 函数名(形参列表)
外部函数:
本文件定义函数时,在函数首部加extern(可省,默认添加)
extern int fun (int a, int b){}
其他文件调用函数时要先声明(可省,默认添加)
extern int fun (int a, int b);
函数声明的作用:通知编译系统,该函数在本文件中稍后定义,或在另一文件中定义。
用函数原型能够把函数的作用域扩展到定义该函数的文件之外(extern可省)
只要在使用该函数的每一个文件中包含该函数的函数原型即可
最常见的例子:#include 命令
头文件里面包含函数原型
函数定义放在函数库中或单独编译成目标文件,在连接阶段与用户文件连接组成可执行文件
预处理——编译——连接
预处理功能:
|--宏定义
|--文件包含
|--条件编译
以#顶格开头,末尾不含;
宏定义:
#define 标识符 字符串 // 已被const语句替换
#defing PI 3.1415926
#define 宏名(参数表) 字符串
#define S(a,b) a*b
S(3,2) 替换为 3*2
文件包含:
一个源文件将另一个源文件的内容复制过来
#include <文件名> 库函数
#include "文件名" 用户自定义头文件,建议用.h结尾
#include <iostream> 到系统目录中找,如果没有则出错
#include "C:\\tan\C++\file.c" 到指定目录寻找,再到系统目录找
#include "file2.c" 到当前目录找,再到系统目录找
条件编译
#ifdef 标识符 #ifndef 标识符 #if 表达式
程序段1 程序段1 程序段1
#else #else #else
程序段2 程序段2 程序段2
#endif #endif #endif
调试时的应用:
#include <iostream>
using namespace std;
#define RUN
int main()
{
int x=1, y=2, z=3;
#ifdef RUN
cout << "x=" << x << "y=" << y << "z=" << z << endl;
#endif
cout << "x+y+z=" << x*y*z << endl;
}
内置函数/内嵌函数/内联函数 inline function
在编译时将所调用函数的代码直接嵌入到主调函数中
适用于规模小又被频繁调用的函数,内置函数中不包括循环和switch语句
inline int max(int, int, int) //函数声明
inline int max(int a, int b, int c){} //函数实现 两者之一有inline即可
函数重载 function overloading
不能出现:参数类型和个数相同,返回值不同的情况
函数模板 function template
建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟类型来表示
这个通用函数就称为模板
适用情况:函数体相同,函数参数个数相同而类型不同
template<typename T>
T max(T a, T b, T c)
{
if (b>a) a=b;
if (c>a) a=c;
return a;
}
template<typename T>
通用函数定义
template<class T> //可以定义多个虚拟类型
通用函数定义
变量的地址称为该变量的指针
& 取地址运算符
* 间接访问运算符(指针运算符)
int * p; 指向整型数据的指针变量
int * p[n]; 指针数组
int (*p)[n]; 指向数组的指针变量
int * p( ); 返回值为指针
int (*p)( ); 函数指针 p=fun; (*p)();//调用
int **p; 指向指针的指针变量
引用
int a;
int &b = a; //b是a的别名,属于地址传递。 必须在声明时赋值
姓童 名林 字表海川 童海川是童林的引用
来源:oschina
链接:https://my.oschina.net/u/2669173/blog/645120