根据储存位置不同,可以分为,静态变量(静态储存区),动态变量(运行时堆栈),寄存器变量(寄存器)

静态变量(静态储存区):全局变量和使用static声明的局部变量都是静态变量,在系统运行过程中只初始化一次。#include <stdio.h>


int a=1; //全局变量存储在静态内存中,只初始化一次

void showMessage(){
    static int b=1; //静态变量存储在静态内存中,第二次调用不会再进行初始化
    int c=1;
    ++b;
    a+=2;
    printf("a=%d,b=%d,c=%d\n",a,b,c);
}

int main(int argc, const char * argv[]) {
    showMessage(); //结果:a=3,b=2,c=1
    showMessage(); //结果:a=5,b=3,c=1
    return 0;
}


解释:



全局变量,作用域在自己的类里,类实现的各处均可调用。储存在静态区

局部变量,作用域在一个方法里,方法结束,变量销毁。储存在动态区,储存在栈中。

自动变量;不含有static的局部变量,储存在栈中。

static修饰的变量;静态变量,作用域为本类(如果其他类调用该变量的同名变量,不会报错。)修饰函数,为内部函数,外部调用会报错。

extern修饰的变量:申明一个已经存在的变量,只是声明,没有初始化。extern修饰函数,是声明和定义函数为外部函数,可以省略,所以所有的函数都默认为外部函数。

单例是全局变量,因为单例在整个程序运行期间只被创建初始化一次,因此单例只保存一个对象,如果在A类中创建单例,那么在B类中再次创建单例的话,单例仍然保持着A类中得对象,单例对象的各种状态就依然保存着A类运行之后的状态。(比如一个播放器对象Player,是一个单例,你在A类中设置Player.playing = YES;之后跳转到B类,再次创建Player对象,Player.playing属性仍然是YES,不会因为重新创建而默认为nil);

重载就是重新加载,就是重新alloc。

总结

最后做一下简单总结一下:

  1. extern作用于变量时用于声明一个已经定义的变量,但是并不能定义变量;使用extern你可以在其他文件中使用全局变量(当然此时extern可以省略);
  2. extern作用于函数时与它作用于全局变量有点类似,声明这个函数是外部函数,其他文件可以访问,但不同的是当它作用于函数时不仅可以声明函数还可以定义函数(用在函数定义前面),不管是定义还是声明都可以省略,C语言默认认为函数定义或声明都是外部函数;
  3. static作用于变量时,该变量只会定义一次,以后在使用时不会重新定义,当static作用于全局变量时说明该变量只能在当前文件可以访问,其他文件中不能访问;
  4. static作用于函数时与作用于全局变量类似,表示声明或定义该函数是内部函数(又叫静态函数),在该函数所在文件外的其他文件中无法访问此函数;
  5. 参考