C C++ OC指针常量和常量指针区别

看Effective Objective-C 2.0  编写高质量iOS与OS X代码的52个有效方法这本书的时候看到有一个说多用类型常量,少用#define预处理指令 ,在这里面有说到指针常量,之前学C C++的时候也遇到过, 现在算是将这些小结。

最重要的一句秘诀就是:*(指针)   const(常量)  谁在前先读谁,谁在前谁不允许改变。

下面是C C++ OC中的例子,其中在OC中指针常量只能赋值一次,不能改变

#import <Foundation/Foundation.h>


int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
//      C -----------------------------------------
        int a=3,b=1;
        
        //常量指针
        int const *p1=&a;
        
        //指针常量
        int *const p2=&b;
        
         NSLog(@"p1=%d p2=%d a=%d b=%d",*p1,*p2,a,b);
        
        //改变指针   将p1指向a p1指针变量存的地址改变 b的地址改为a的地址
        p1=&b;
        
        NSLog(@"p1=%d p2=%d a=%d b=%d",*p1,*p2,a,b);
        
        //改变变量
        *p2=5;    // p2 指针变量存的地址不变 改变的是p2指的变量的值
        NSLog(@"p1=%d p2=%d a=%d b=%d",*p1,*p2,a,b);
        
//      OC------------------------------------------
        
        NSString *str = @"abc";
        NSString *str2=@"123";
       
        NSLog(@"str的地址:%p 指向变量的地址:%p 指向变量值:%@",&str,str,str);
        
        
        NSLog(@"str2的地址:%p 指向变量的地址:%p 指向变量值:%@",&str2,str2,str2);

        NSString const * strp=str;
        
        NSLog(@"strp=%@  str=%@  str2=%@",strp,str,str2);
        
        strp=str2;
        
        NSLog(@"strp=%@  str=%@  str2=%@",strp,str,str2);
        
        //在oc中NSObject类型指针常量赋值 无法改变常量
        NSString *const strp1=str2;
        
        NSLog(@"strp1=%@  str=%@  str2=%@",strp1,str,str2);
        
        str2=@"xyz";
        
        NSLog(@"strp1=%@  str=%@  str2=%@",strp1,str,str2);
    }
    return 0;
}

#include <iostream>

using namespace std;

int main(int argc, const char * argv[]) {
    
    string str1 = "abc";
    string str2 = "345";

    //常量指针
    string const *str1Prt = &str1;
    
    //指针常量
    string * const str2Prt = &str2;
    
    // 获取str1Prt 指针存的地址、指向的地址  &str1Prt是自身的地址
    cout << str1Prt << " " << *str1Prt << endl;
    
    //改变指针
    str1Prt = &str2;
    
    cout << str1Prt << " " << *str1Prt << endl;

    cout << str2Prt << " " << *str2Prt << " " << str1 << " " << str2 << endl;
    
    //改变变量
    *str2Prt = "fff";
    
    cout << str2Prt << " " << *str2Prt << " " << str1 << " " << str2 << endl;
    
    return 0;
}

 

转载于:https://www.cnblogs.com/5ishare/p/4858614.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值