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;
}





相关文章
|
7月前
|
算法 Java 数据库连接
Java 与 C++ 区别深入剖析及应用实例详解
本文深入剖析了Java和C++两种编程语言的区别,从编译与执行机制、面向对象特性、数据类型与变量、内存管理、异常处理等方面进行对比,并结合游戏开发、企业级应用开发、操作系统与嵌入式开发等实际场景分析其特点。Java以跨平台性强、自动内存管理著称,适合企业级应用;C++则因高性能和对硬件的直接访问能力,在游戏引擎和嵌入式系统中占据优势。开发者可根据项目需求选择合适语言,提升开发效率与软件质量。附面试资料链接:[点此获取](https://pan.quark.cn/s/4459235fee85)。
707 0
|
存储 C++ Cloud Native
云原生部署问题之C++ 中的 nullptr 和 NULL 区别如何解决
云原生部署问题之C++ 中的 nullptr 和 NULL 区别如何解决
200 0
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
存储 数据可视化 C++
第九问:能否尽可能详细阐述指针和引用的区别?
在C++中,指针和引用是两个重要的概念,用于操作内存地址和数据。指针是一个存储内存地址的变量,可以动态分配和释放内存;引用是变量的别名,绑定后不可改变指向。指针提供更大的灵活性和控制力,适用于复杂内存操作;引用更直观,适合简化代码并提高可读性。根据实际需求选择合适的工具。
|
C语言 C++
C 语言的关键字 static 和 C++ 的关键字 static 有什么区别
在C语言中,`static`关键字主要用于变量声明,使得该变量的作用域被限制在其被声明的函数内部,且在整个程序运行期间保留其值。而在C++中,除了继承了C的特性外,`static`还可以用于类成员,使该成员被所有类实例共享,同时在类外进行初始化。这使得C++中的`static`具有更广泛的应用场景,不仅限于控制变量的作用域和生存期。
355 10
|
存储 C语言
C语言指针与指针变量的区别指针
指针是C语言中的重要概念,用于存储内存地址。指针变量是一种特殊的变量,用于存放其他变量的内存地址,通过指针可以间接访问和修改该变量的值。指针与指针变量的主要区别在于:指针是一个泛指的概念,而指针变量是具体的实现形式。
|
存储 编译器 C语言
C++内存管理(区别C语言)深度对比
C++内存管理(区别C语言)深度对比
324 5
|
C语言 C++
实现两个变量值的互换[C语言和C++的区别]
实现两个变量值的互换[C语言和C++的区别]
217 0
|
Web App开发 Rust 分布式计算
Rust与C++的区别及使用问题之对于大量使用C++实现的产品来说,迁移到Rust的问题如何解决
Rust与C++的区别及使用问题之对于大量使用C++实现的产品来说,迁移到Rust的问题如何解决
247 1
|
Rust 安全 编译器
Rust与C++的区别及使用问题之Rust中的bound check对性能产生影响的问题如何解决
Rust与C++的区别及使用问题之Rust中的bound check对性能产生影响的问题如何解决
191 1