对于Const的理解

2018-09-02  本文已影响16人  西门淋雨

让我们一起奔跑吧:


IMG_2006.JPG

直接上代码,注释也很详细:

//
//  TestConstVC.m
//  OCProject
//
//  Created by wqq on 2018/9/2.
//  Copyright © 2018年 wqq. All rights reserved.
//

#import "TestConstVC.h"

@interface TestConstVC ()

@end

@implementation TestConstVC

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    
    int a = 10;
    a = 20;
    
    //下面两种写法一样,const 均修饰右边的变量
    int const b = 10;
    const int b2 = 10;
    //b = 20//会报错,不允许修改

    int *p = &a;
    int c = 20;
    p = &c;
   
    //下面的两种写法一样
    const int *d = p;
    NSLog(@"d===%p",d);
    int const *e = p;
    NSLog(@"d===%p",e);
    //d 和 e的值是一样的
    //*d = 20;//会报错
    //上述const修饰的是(*d)和(*e),所以*d 和 *e的值(指针指向的地址存贮的值)不能修改,但是e和d两个指针变量的值可以修改。
    d = &b;
    e = &b;
    
    
    int * const f = &a;
    NSLog(@"f===%p",f);
    //f = &a;//报错,不能修改f的值
    
    //下面的两种写法一样
    const int *const k = &c;
    NSLog(@"k===%p",k);
    int const *const j = &c;
    NSLog(@"j===%p",j);
//    k = &b;//报错
//    *k = 80;//报错
//    j = &b;//报错
//    *j = 80;//报错
    //上述的两种写法是一样的,第一个const修改的是*k和*j,所以*k和*j不能修改,第二个const修饰的是变量k和j(k和j都是指针变量,他们的值也不能修改)
    
    [self test:&a];
    
    [self test2:&a];
}
- (void)test:(const int *)ak{
    NSLog(@"ak===%p",ak);
    //*ak = 100;//会报错,const修饰的是(*ak),即 指针变量指向的内存空间存贮的值不能修改
    int o = 100;
    ak = &o;//但是可以修改指针的值
    NSLog(@"ak===%p",ak);
}
- (void)test2:(int *const)bk{
    int pp = 100;
    //bk = &pp;//报错,const修饰的是bk指针
    *bk = pp;//但是可以修改bk指针指向的空间存储的值
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}
@end

上一篇下一篇

猜你喜欢

热点阅读