const
const
翻译成中文是常量,常量是不可变的。
const
作用:
-
const
用来修饰基本变量或指针变量。 - "被修饰的变量只读,不能被修改"。
const
的使用
- (void)viewDidLoad {
[super viewDidLoad];
// ——————————基本变量量——————————
int a = 20;
// 允许修改值
a = 2;
// 加const b只读
const int b = 20;
// int const b = 20;//和const int b = 20;等价
// b = 2;//报错
// ——————————基本变量——————————
// ——————————指针变量——————————————
int c = 5;
int *p = &a;
printf("p = %d\n",*p);//输出2
p = &c;//可以修改地址
printf("p = %d\n",*p);//输出5
*p = 100;//可以修改值
printf("p = %d\n",*p);//输出100
// 第一种形式
const int *p1 = &a; // 其指向地址可改 值不能改
printf("p1 = %d\n",*p1);
// *p1 = 3;//报错不能修改值
p1 = &c;
printf("p1 = %d\n",*p1);//输出100;
// 第二种形式 此时a = 2 c = 100
int * const p2 = &a; //可以修改值,不能修改其指向地址
*p2 = 3;
printf("p2 = %d\n",*p2);//输出3
// p2 = &c;//报错 不能修改p2 地址
// 第三种形式 //此时 a = 3 c = 100
// const int * const p3
int const * const p3 = &a;//等价于上一种
// *p3 = 10;// 报错 不能修改值
// p3 = &c; //报错 不能修改其指向地址
// ——————————指针变量——————————————
}
总结
// 二者"等同"
// *p1 常量 p1 变量
const int *p1
int const *p1
// *p2 变量 &p2 常量
int * const p2 //可以修改值,不能修改其指向地址
// 二者"等同"
// *p3 和 p3都为常量
int const * const p3
const int * const p3
const
在方法参数的限制作用
- (void)test:(const int * )a
{
int c = 10;
// 其指向地址可改 值不能改
a = &c;
*a = 10; //报错
}
- (void)test2:(int * const)a
{
int c = 10;
//可以修改值,不能修改其指向地址
*a = 10;
// a = &c; //报错
}
- (void)viewDidLoad {
[super viewDidLoad];
int a = 1;
[self test:&a];
[self test2:&a];
}
static
static
作用:
- 修饰局部变量:
- 延长局部变量的生命周期,程序结束才会销毁。
- 局部变量只会生成一份内存,只会初始化一次。
- 改变局部变量的作用域。
- 修饰全局变量
- 只能在本文件中访问,修改全局变量的作用域,生命周期不会改。
- 避免重复定义全局变量。
extern
extern
作用:
- 只是用来获取全局变量(包括全局静态变量)的值,不能用于定义变量。
extern
工作原理:
- 先在当前文件查找有没有全局变量,没有找到,才会去其他文件查找。
static和extern的使用
int a = 10;
//修饰全局变量 只能在本文件中访问
static int age = 100;
@interface ViewController ()
@end
@implementation ViewController
- (void)test {
// 修饰局部变量
// 延长局部变量的生命周期
//局部变量只会生成一份内存,只会初始化一次。
//
static int age = 0;
age ++;
printf("age = %d\n",age);
}
- (void)viewDidLoad {
[super viewDidLoad];
for (int i = 0; i<30; i++) {
[self test];
}
// 只是用来获取全局变量(包括全局静态变量)的值
// 如果没有此全局变量就报错
extern int age;
NSLog(@"extern age = %d",age); //输出100
}
在AppDelegate
中 不需要导入头文件
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
// 用来获取全局变量(包括全局静态变量)的值
extern int a;
NSLog(@"start a = %d",a);//打印start a = 10
return YES;
}
static与const联合使用
//a是全局变量 用static修饰只能在本文件中访问,修改全局变量的作用域
//避免重复定义全局变量
//开发中声明的全局变量,有些不希望外界改动,只允许读取。
// 声明一个静态的全局只读常量
static const int a = 10;
//----------------
//声明key 只读不可修改
static NSString * const key = @"title_book";
extern与const联合使用
场景:某一字符串常量在多个其他文件中被用到。
只需要定义一份全局变量,多个文件共享。
建议搞一个专门定义全局变量的类,方便管理。这里以GlobeConst为例
- GlobeConst.h
extern NSString * const name;
- GlobeConst.m
NSString * const name = @"Joe";
可以使用extern NSString *name;
获取name。
网友评论