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

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

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

  1. #import <Foundation/Foundation.h>
  2.  
  3. int main(int argc, const char * argv[]) {
  4. @autoreleasepool {
  5.  
  6. // C -----------------------------------------
  7. ,b=;
  8.  
  9. //常量指针
  10. int const *p1=&a;
  11.  
  12. //指针常量
  13. int *const p2=&b;
  14.  
  15. NSLog(@"p1=%d p2=%d a=%d b=%d",*p1,*p2,a,b);
  16.  
  17. //改变指针 将p1指向a p1指针变量存的地址改变 b的地址改为a的地址
  18. p1=&b;
  19.  
  20. NSLog(@"p1=%d p2=%d a=%d b=%d",*p1,*p2,a,b);
  21.  
  22. //改变变量
  23. *p2=; // p2 指针变量存的地址不变 改变的是p2指的变量的值
  24. NSLog(@"p1=%d p2=%d a=%d b=%d",*p1,*p2,a,b);
  25.  
  26. // OC------------------------------------------
  27.  
  28. NSString *str = @"abc";
  29. NSString *str2=";
  30.  
  31. NSLog(@"str的地址:%p 指向变量的地址:%p 指向变量值:%@",&str,str,str);
  32.  
  33. NSLog(@"str2的地址:%p 指向变量的地址:%p 指向变量值:%@",&str2,str2,str2);
  34.  
  35. NSString const * strp=str;
  36.  
  37. NSLog(@"strp=%@ str=%@ str2=%@",strp,str,str2);
  38.  
  39. strp=str2;
  40.  
  41. NSLog(@"strp=%@ str=%@ str2=%@",strp,str,str2);
  42.  
  43. //在oc中NSObject类型指针常量赋值 无法改变常量
  44. NSString *const strp1=str2;
  45.  
  46. NSLog(@"strp1=%@ str=%@ str2=%@",strp1,str,str2);
  47.  
  48. str2=@"xyz";
  49.  
  50. NSLog(@"strp1=%@ str=%@ str2=%@",strp1,str,str2);
  51. }
  52. ;
  53. }

  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main(int argc, const char * argv[]) {
  6.  
  7. string str1 = "abc";
  8. ";
  9.  
  10. //常量指针
  11. string const *str1Prt = &str1;
  12.  
  13. //指针常量
  14. string * const str2Prt = &str2;
  15.  
  16. // 获取str1Prt 指针存的地址、指向的地址 &str1Prt是自身的地址
  17. cout << str1Prt << " " << *str1Prt << endl;
  18.  
  19. //改变指针
  20. str1Prt = &str2;
  21.  
  22. cout << str1Prt << " " << *str1Prt << endl;
  23.  
  24. cout << str2Prt << " " << *str2Prt << " " << str1 << " " << str2 << endl;
  25.  
  26. //改变变量
  27. *str2Prt = "fff";
  28.  
  29. cout << str2Prt << " " << *str2Prt << " " << str1 << " " << str2 << endl;
  30.  
  31. ;
  32. }

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

  1. C和指针 第三章 指针常量与常量指针

    c语言中声明常量的两种方式 const int value int const value 如果要声明常量的指针,即指向常量的指针,则可以参考上面的常量声明修改一下 const int *ptr in ...

  2. c++ 指针常量,常量指针

    当const遇到指针 一般来说,const修饰指针可以分为下面的集中情况. 描述 例子 含义 备注 const在*的左边 const int *b=&a; int const *b=& ...

  3. C++中指针常量和常量指针的区别

    在C++学习使用过程中,每个人都不可避免地使用指针,而且都或多或少的接触过常量指针或指针常量,但是对这两个的概念还是很容易搞糊涂的. 本文即是简单描述指针常量和常量指针的区别. 常量指针 定义: 又叫 ...

  4. 【转】C++易混知识点1: 指针常量和常量指针的区别,附有详细案例解释

    熟悉C++也已经有一些年头了,今天突然翻出当年浏览的书籍,对一些概念居然生疏了,指针常量和常量指针由于 指针 这一特殊的对象而变得难以区别.因此,在思考再三之后,决定写下该篇总结,加强对他们的区别: ...

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

    [转]作者:xwdreamer   出处:http://www.cnblogs.com/xwdreamer 对于指针和常量,有以下三种形式都是正确的: const char * myPtr = &am ...

  6. C++ 指针常量和常量指针

    1.指针常量(*const):对应指针变量,即指针本身是常量,指针指向的内容可以被修改. 2.常量指针(const*):常量的指针,即指针指向的内容不能被修改,但指针本身是变量,可以被修改.

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

    常量指针定义:常量是形容词,指针是名词,以指针为中心的一个偏正结构短语.这样看,常量指针本质是指针,常量修饰它,表示这个指针乃是一个指向常量的指针.指针指向的对象是常量,那么这个对象不能被更改.常量指 ...

  8. 数组/指针/const/字符串常量的使用传值问题

    #include<stdio.h> #include<string.h> int main() { ] = "abcd"; //常指针a指向字符串常量&qu ...

  9. 再学C/C++ 之 指针常量 和 常量指针

    (1)指针常量,将指针的指向当成常量.即指针变量的值只能在定义的时候初始化,定义后不能修改,也就是说不能改变指针变量的指向.但是不影响所指对象的访问特征.其定义形式为: 类型 * const 指针 / ...

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

    const char * myPtr = &char_A;//指向常量的指针 char * const myPtr = &char_A;//常量的指针 const char * con ...

随机推荐

  1. @Configurable

    spring的一个注解,用来自动注入bean的注解,不需要通过BeanFactory去获取    

  2. c++实验6 递归

    1 利用递归设计此函数. int p(int a,int b) { if(a>=b) ; else ; } //粘贴测试数据及运行结果: //测试数据 int main() { cout < ...

  3. OCP考试题库更新,052最新考题及答案整理-第8题

    8.Which two are true about the Fast Recovery Area (FRA)? A) It should be larger than the database. B ...

  4. css3旋转动画

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  5. [Objective-C语言教程]扩展(30)

    类扩展与类别有一些相似之处,但它只能添加到编译时具有源代码的类中(类与类扩展同时编译). 类扩展声明的方法是在原始类的实现块中实现的,因此不能在框架类上声明类扩展,例如Cocoa或Cocoa Touc ...

  6. 【Qt】VS2010编译Qt5.3.2 64bit

    1. 为什么要这么做 在Windows下,Qt官网默认提供的二进制版本大多是32位,目前(2015.01.24)只对VS2013提供了64位版本,如下图所示: 为了适应我目前安装的VS2010 IDE ...

  7. 序列化库MessagePack应用(C++)

    介绍 MessagePack(简称msgpack)是一个小巧而高效的序列化/反序列化库,支持多种开发语言.官方网站:http://msgpack.org/ . 下面是官方的一个简介: It's lik ...

  8. KMP算法再解 (看毛片算法真是人如其名,哦不,法如其名。)

    KMP算法主要解决字符串匹配问题,其中失配数组next很关键: 看毛片算法真是人如其名,哦不,法如其名. 看了这篇博客,转载过来看一波: 原博客地址:https://blog.csdn.net/sta ...

  9. 设计简单登录界面(Java web)

    程序设计思想: 在Input.jsp中创建一个表格里边分别是课程名称,任课老师,教学地点,并分别用三个文本框来接受输入的三个属性, 并传到另外的Jsp页面中,又来接受三个数据,并判断传来的教师,与教室 ...

  10. SQL Server——存储过程(Stored Procedure)、事物、触发器

    存储过程(proc 或 procedure) 存储过程(Stored Procedure),计算机用语,是一组为了完成特定功能的SQL语句集,是利用SQL Server所提供的Transact-SQL ...