static和const

225 阅读1分钟

原文链接

static

  1. 修饰局部变量
  • 让局部变量只初始化一次
  • 局部变量在程序中只有一份内存
  • 不会改变局部变量的作用域,仅仅是改变了局部变量的生命周期(只到程序结束,这个局部变量才会销毁)
  1. 修饰全局变量

全局变量的作用域仅限于当前文件

const

  1. 没有const修饰的指针
    // 定义一个指针变量
    int *p = NULL;

    // 定义2个int类型的变量
    int a = 10;
    int b = 30;

    // p指向a
    p = &a;
    *p = 20;

    // p指向b
    p = &b;
    *p = 40;

    NSLog(@"%d %d", a, b);
  1. const修饰的* p: 编译器报错,不能修改*p的值
    // const修饰的*p
    const int *p = NULL;
    int const *p = null;

    *p = 20; // 编译器报错,不能修改*p的值

  1. const修饰的p:被const修饰的p只能存一次地址,以后再也不能其它存地址了,否则编译器报错
    // const修饰的指针变量p
    int * const p = NULL;
    int a = 20;

    p = &a; // 编译器报错,不能修改指针变量p

static const 与 #define

相同点:都不能再次被修改,一处修改全部改变

不同点:statci const 修饰变量只有一份内存,宏则是简单替换。

const一般使用

.h 文件

// 引用某变量,如果没有使用const修饰,就不能直接在编译的时候就能检测是否修改了ZMJRed
extern const CGFloat ZMJRed;
extern NSString * const ZMJName;

或

UIKIT_EXTERN const CGFloat ZMJRed;
UIKIT_EXTERN NSString * const ZMJName;

.m 文件

// 定义了整个程序都能访问的常量
const CGFloat ZMJRed = 0.4;
NSString * const ZMJName = @"jack";