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

时间: 2025-01-08 06:50:47

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

常量指针和指向常量的指针

3种与const.指针及指针指向的对象有关的情形: 1.指向常量对象的指针 2.指向某个对象的常量指针 3.指向常量对象的常量指针 在第一种情况中,我们不能修改被指向的对象,但可以使指针指向其他对象: const char* pstring("Some text"); 在第二种情况中,我们不能修改指针中存储的地址,但可以修改指针指向的对象: char* const pstring("Some text"); 在最后一种情况中,指针和被指向的对象都被定义成常量,因此都

指针常量&amp;指向常量的指针

3 4 #include "stdafx.h" 5 6 int main(int argc, char* argv[]) 7 { 8 int a; 9 int b; 10 int* const p1 = &a; //常量指针,指针不可以改,但是指针指向的内容可以改. 11 const int* p2; //指向常量的指针,指针可以改,但是指针指向的内容不可以改. 12 13 const int c = 3; 14 15 a = 1; 16 b = 2; 17 // p1 = &

指针总结以及常量指针与指向常量的指针与指向常量的常指针

/*指针总结: 1:指针未被初始化一个地址或刚删除一个指针都要将其初始化为0,否则的话将会导致该指针失控 2:假如不想改变一个指针,那么将该指针定义为const, 假如不想改变该指针指向的值,将指针指向的值定义为const 假如即不想改变指针又不想改变指针指向的值,那么将指针和指针指向的值都定义为const 在new堆中创建一个对象,然后将内存地址赋给指针,之后我们就可以通过内存地址访问堆中的对象, 假如要删除该对象,我们只需要使用关键字delete,那么就会删除指针指向的对象并释放存储对象的内

c语言常量指针赋值给变量指针导致警告

常量指针定义:常量是形容词,指针是名词,以指针为中心的一个偏正结构短语.这样看,常量指针本质是指针,常量修饰它,表示这个指针乃是一个指向常量的指针.指针指向的对象是常量,那么这个对象不能被更改.常量指针的使用要注意,指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改,也就是说常量指针可以被赋值为变量的地址,之所以叫做常量指针,是限制了通过这个指针修改变量的值. 在C/C++中,常量指针是这样声明的: 1)const int *p; 2)int const *p; 例子: int

C指针常量与常量指针

c语言中声明常量的两种方式 const int value int const value 如果要声明常量的指针,即指向常量的指针,则可以参考上面的常量声明修改一下 const int *ptr int const *ptr 把*ptr看成一个整体,那么*ptr中的ptr就是指向常量的指针了.顾名思义,指向常量的指针,那么就不可以通过这个指针去修改这个值了. #include <stdio.h> int main(){ int val = 123; int const *ptr = &

指针常量和常量指针

这两个概念经常分不清,今天好好总结一下. 一.指针常量 先说指针常量,是因为它和我们常用的数组有关系. 指针常量的声明 int * const p; 指针声明操作符*在常量限定符const前面,叫做指针常量.忽然发现了一点规律^_^. const限定符修饰的是指针.数组名就是一个指针常量.而数组名和指针有什么区别呢?可以通过引用数组名去修改指向的内存,但是自身不可以被赋值,不可以进行++.–操作. 二.常量指针 常量指针的声明 const int * p1; int const * p2; 常量

常指针和指向常量的指针和指向常量的常指针

(1)指向常量的指针:是一个指向的内容是常量的指针变量,const int *p=&x;不可修改*p的内容,但可以让指针p指向另一个地址,和int const *p一样 (2)常指针:int *const p=&x指针本身是个常量,固定指向某一变量,因此p不可变,但是*p可变 (3)指向常量的常指针:const int *const p=&x,指针p永远指向x,并且不能通过它修改它指向的地址的内容

CII-2.4指针常量和常量指针

#define T Stack_T typedef struct T *T; struct T { int count; struct elem { void *x; struct elem *link; } *head; } const T stk //指针常量, const修饰struct T *.地址不能变. const struct T *stk //指向常量的指针, const修饰struct T.数据不能变. CII-2.4指针常量和常量指针,布布扣,bubuko.com

常量指针、指针常量、常量指针常量

1 #include<stdio.h> 2 3 int main() 4 { 5 int a = 120; 6 int b = 60; 7 8 /* 9 * 常量指针, 不可以修改指向地址 10 * 的存储空间里的值,但可以修改指向地址的值 11 */ 12 int const *p1 = &a; 13 const int *p2 = &a; //常量指针 14 15 /* 16 * 指针常量,不可以修改指向的地址 17 * 但可以修改所指向地址存储空间里的内容 18 */ 1

指针常量与常量指针的区别

#include <iostream> #include <stdio.h> #include <string.h> #include <vector> using namespace std; int main() { int a=1,b=2; //--常量指针-- const int *cp = &a; //常量指针,本质是个指针:const修饰的是p1指向的变量,所以指向变量值不可变,指向可以改变 //*p1 = 3; //error,常量指针