修饰局部变量面试
修饰全局变量函数
没有const修饰的指针spa
指针p和*p都能被修改指针
// 定义一个指针变量 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);
const修饰的*pcode
被const修饰的*p只能被赋值一次,之后不能赋值,不然编译器报错生命周期
// const修饰的*p const int *p = NULL; int const *p = null; *p = 20; // 编译器报错,不能修改*p的值
const修饰的pip
被const修饰的p只能存一次地址,之后不再能其它存地址了,不然编译器报错内存
// const修饰的指针变量p int * const p = NULL; int a = 20; p = &a; // 编译器报错,不能修改指针变量p
NSString * const ZMJName = @"jack";
// 定义了一个局部常量 static const CGFloat ZMJRed = 0.4; static const CGFloat ZMJGreen = 0.6; static const CGFloat ZMJBlue = 0.7;
static const
取代#define
// static const修饰变量只有一分内存 static const CGFloat ZMJRed = 0.4; // 宏定义,只是用0.4替换ZMJRed,每次使用都须要建立一分内存 #define ZMJRed 0.4
通常会先新建ZMJConst.h
文件专门存放常量的引用作用域
// 引用某变量,若是没有使用const修饰,就不能直接在编译的时候就能检测是否修改了ZMJRed extern const CGFloat ZMJRed; extern NSString * const ZMJName;
UIKIT_EXTERN const CGFloat ZMJRed; UIKIT_EXTERN NSString * const ZMJName;
通常会新建ZMJConst.m
文件专门存放static const修饰的变量,须要用的时候导入头文件就能够了。开发
// 定义了整个程序都能访问的常量 const CGFloat ZMJRed = 0.4; NSString * const ZMJName = @"jack";
文/zhazha(简书做者)
原文连接:http://www.jianshu.com/p/0a9d2d8062da
著做权归做者全部,转载请联系做者得到受权,并标注“简书做者”。
const简介
:以前经常使用的字符串常量,通常是抽成宏,可是苹果不推荐咱们抽成宏,推荐咱们使用const常量。
编译时刻
:宏是预编译(编译以前处理),const是编译阶段。编译检查
:宏不作检查,不会报编译错误,只是替换,const会编译检查,会报编译错误。宏的好处
:宏能定义一些函数,方法。 const不能。宏的坏处
:使用大量宏,容易形成编译时间久,每次都须要从新替换。
注意:不少Blog都说使用宏,会消耗不少内存,我这验证并不会生成不少内存,宏定义的是常量,常量都放在常量区,只会生成一分内存。
Snip20151014_1.png
// 常见的常量:抽成宏 #define XMGAccount @"account" #define XMGUserDefault [NSUserDefaults standardUserDefaults] // 字符串常量 static NSString * const account = @"account"; - (void)viewDidLoad { [super viewDidLoad]; // 偏好设置存储 // 使用宏 [XMGUserDefault setValue:@"123" forKey:XMGAccount]; // 使用const常量 [[NSUserDefaults standardUserDefaults] setValue:@"123" forKey:account]; }
const基本使用
- (void)viewDidLoad { [super viewDidLoad]; // 定义变量 int a = 1; // 容许修改值 a = 20; // const两种用法 // const:修饰基本变量p // 这两种写法是同样的,const只修饰右边的基本变量b const int b = 20; // b:只读变量 int const b = 20; // b:只读变量 // 不容许修改值 b = 1; // const:修饰指针变量*p,带*的变量,就是指针变量. // 定义一个指向int类型的指针变量,指向a的地址 int *p = &a; int c = 10; p = &c; // 容许修改p指向的地址, // 容许修改p访问内存空间的值 *p = 20; // const修饰指针变量访问的内存空间,修饰的是右边*p1, // 两种方式同样 const int *p1; // *p1:常量 p1:变量 int const *p1; // *p1:常量 p1:变量 // const修饰指针变量p1 int * const p1; // *p1:变量 p1:常量 // 第一个const修饰*p1 第二个const修饰 p1 // 两种方式同样 const int * const p1; // *p1:常量 p1:常量 int const * const p1; // *p1:常量 p1:常量 }
@implementation ViewController // const放*前面约束参数,表示*a只读 // 只能修改地址a,不能经过a修改访问的内存空间 - (void)test:(const int * )a { // *a = 20; } // const放*后面约束参数,表示a只读 // 不能修改a的地址,只能修改a访问的值 - (void)test1:(int * const)a { int b; // 会报错 a = &b; *a = 2; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. int a = 10; // 需求1:提供一个方法,这个方法的参数是地址,里面只能经过地址读取值,不能经过地址修改值。 // 这时候就须要使用const,约束方法的参数只读. [self test:&a]; // 需求2:提供一个方法,这个方法的参数是地址,里面不能修改参数的地址。 [self test1:&a]; } @end
static做用
:
修饰局部变量:
1.延长局部变量的生命周期,程序结束才会销毁。
2.局部变量只会生成一分内存,只会初始化一次。
3.改变局部变量的做用域。
修饰全局变量
1.只能在本文件中访问,修改全局变量的做用域,生命周期不会改
2.避免重复定义全局变量
extern做用
:
extern工做原理
:
// 全局变量:只有一分内存,全部文件共享,与extern联合使用。 int a = 20; // static修饰全局变量 static int age = 20; - (void)test { // static修饰局部变量 static int age = 0; age++; NSLog(@"%d",age); } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [self test]; [self test]; extern int age; NSLog(@"%d",age); } I
一个文件中
常用的字符串常量,可使用static与const组合// 开发中经常使用static修饰全局变量,只改变做用域 // 为何要改变全局变量做用域,防止重复声明全局变量。 // 开发中声明的全局变量,有些不但愿外界改动,只容许读取。 // 好比一个基本数据类型不但愿别人改动 // 声明一个静态的全局只读常量 static const int a = 20; // staic和const联合的做用:声明一个静态的全局只读常量 // iOS中staic和const经常使用使用场景,是用来代替宏,把一个常用的字符串常量,定义成静态全局只读变量. // 开发中常常拿到key修改值,所以用const修饰key,表示key只读,不容许修改。 static NSString * const key = @"name"; // 若是 const修饰 *key1,表示*key1只读,key1仍是能改变。 static NSString const *key1 = @"name";
多个文件中
常用的同一个字符串常量,可使用extern与const组合。/*******************************首页****************************/ extern NSString * const nameKey = @"name"; /*******************************首页****************************/
#import <Foundation/Foundation.h> /*******************************首页****************************/ NSString * const nameKey = @"name"; /*******************************首页****************************/
文/峥吖(简书做者) 原文连接:http://www.jianshu.com/p/2fd58ed2cf55 著做权归做者全部,转载请联系做者得到受权,并标注“简书做者”。