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

时间: 2024-11-05 19:35:50

C C++ OC指针常量和常量指针区别的相关文章

指针常量和常量指针

这2个概念非常容易混淆,即使是老鸟,也有眩晕的时候,写此博文,加深记忆...   指针常量:一个指针,并且它是一个常量,它的值不许被改变: char *const p1 = "Hello!"; //必须在定义的时候初始化,因为它是常量 p1 = "NiHao!"; //错误,不允许对常量赋值   常量指针:一个指针,并且它指向对象是一个常量(不许改变),但该指针本身的值可以被改变: const char *p2 = "Hello!"; //可以不

const int *p和int * const p的区别(常量指针与指向常量的指针) .

  对于指针和常量,有以下三种形式都是正确的: const char * myPtr = &char_A;//指向常量的指针 char * const myPtr = &char_A;//常量的指针 const char * const myPtr = &char_A;//指向常量的常量指针 下面依次对这三种类型进行介绍. 因为*操作符是左操作符,左操作符的优先级是从右到左,对于 1.常量指针(Constant Pointers) int * const p 先看const再看*

简单总结C++中指针常量与常量指针的区别_C 语言

我们先回顾下,什么是指针?什么是常量?指针是一种特殊的变量,它里面存储的内容是内存地址.常量是指其里面存储的内容不能发生改变的量.明白了这两个概念后,我们现在正式进入指针常量与常量指针. 1.指针常量与常量指针的概念 指针常量就是指针本身是常量,换句话说,就是指针里面所存储的内容(内存地址)是常量,不能改变.但是,内存地址所对应的内容是可以通过指针改变的. 常量指针就是指向常量的指针,换句话说,就是指针指向的是常量,它指向的内容不能发生改变,不能通过指针来修改它指向的内容.但是,指针自身不是常量

c++中指针常量,常指针,指向常量的常指针区分

const char * myPtr = &char_A;//指向常量的指针 char * const myPtr = &char_A;//常量的指针 const char * const myPtr = &char_A;//指向常量的常量指针 1.指针常量 **从字面意思可以看出,指针是一个常量,也就是地址不能被修改. #include <iostream> using namespace std; void main() { int a = 10; int cons

深入const int *p与int * const p的区别详解(常量指针与指向常量的指针)_C 语言

对于指针和常量,有以下三种形式都是正确的: 复制代码 代码如下: const char * myPtr = &char_A;//指向常量的指针char * const myPtr = &char_A;//常量的指针const char * const myPtr = &char_A;//指向常量的常量指针 下面依次对这三种类型进行介绍.因为*操作符是左操作符,左操作符的优先级是从右到左,对于1.常量指针(Constant Pointers) 复制代码 代码如下: int * con

C++中的指针、数组指针与指针数组、函数指针与指针函数

C++中的指针.数组指针与指针数组.函数指针与指针函数 本文从初学者的角度,深入浅出地详解什么是指针.如何使用指针.如何定义指针.如何定义数组指针和函数指针,并给出对应的实例演示:接着,区别了数组指针与指针数组.函数指针与指针函数:最后,对最常混淆的引用传递.值传递和指针传递做了区处. C++中一个重要的特性就是指针,指针不仅具有获得地址的能力,还具有操作地址的能力.指针可以用于数组.或作为函数的参数,用来访问内存和对内存的操作,指针的使用使得C++很高效,但是指针也非常危险,使用不当会带来比较

c-定义一个数组存放数据和定义一个指针存放东西有什么区别

问题描述 定义一个数组存放数据和定义一个指针存放东西有什么区别 定义一个数组存放数据和定义一个指针存放东西有什么区别,u8 a[]="adflkadjflkdjf"和u8 *b="adakkjfakdhflkd"这两种格式是一样的吧,但是当需要定义一个存储空间是可以用数组,U8 c[20],但是没办法用指针实现吧 解决方案 后者"adakkjfakdhflkd"在常量区,不能修改. 解决方案二: 如何动态定义一个 对象指针数组 解决方案三: 你可

c语言-C语言:字符串常量和浮点常量的区别?

问题描述 C语言:字符串常量和浮点常量的区别? C语言:字符串常量和浮点常量的区别是什么?还有一般的整型?他们是不是存储在一个区域 解决方案 希望可以尽快得到解答 解决方案二: 常量都放在常量池中,可以是任何类型 解决方案三: 这个很简单,你定义一些常量,输出它们的指针,你会很容易发现,它们的确是在差不多的地方的.(相比堆栈和堆的地址) 解决方案四: 应该是存储在同一个区域 解决方案五: 区别在于他们译码方式不同.在同一个区存储区域内. 解决方案六: 1) 形式上: ...字符常量是单引号引起的

C语言 指针数组 和 指向指针的指针

指针数组 指针数组是一种特殊的数组,这类数组存放的全部是同一数据类型的内存地址.指针数组的定义形式为:     数据类型 *数组名[长度]; 例如: const char *c[4] = { "China", "USA", "Rassia", "Japan" }; // 定义长度为 4 的常量字符型指针数组,将数组元素分别指向 4 个 字符串常量 int i;for (i = 0; i < 4; i++){    put

深入理解C指针之一:初识指针

原文:深入理解C指针之一:初识指针 简单来说,指针包含的就是内存地址.理解指针关键在于理解C的内存管理模式.C里面有三种内存: ①.静态全局内存(生命周期从程序开始到程序结束,全局变量作用域是全局,静态变量作用域在定义它们的函数内部): ②.自动内存(在函数内部声明的变量,在函数被调用时创建,作用域和生命周期都在函数内部): ③.动态内存(内存分配在堆上,根据需要释放,通过指针引用,作用域局限于引用的指针): 下面先来声明一个指针并打印其地址和值,这里p%指的是以十六进制的形式返回数据: #in