03 - const static extern

const是一个C语言的关键字,它限定一个变量不允许被改变。使用const可以在一定程度上提高程序的安全性和可靠性,再者在看别人的代码作品的时候也可以有助于清晰理解const所起的作用。

 

1、const和#define的区别

  (1)编译器处理的方式不相同

  define定义的宏是在预处理阶段展开的,而const定义的常量则是在编译阶段使用的

  (2)类型和安全检查不同

  define宏没有类型,并且不做任何的类型检查,仅仅是展开

  const常量具有具体的类型,在编译阶段会执行类型检查

  (3)存储方式不同

   define定义的宏替换是在编译前完成,并且有多少地方使用,就会出现多少个临时常量的内存,并不会分配内存

   const常量会在内存中分配

 2、const变量vs常量

  常量,例如5和“abc”等,肯定是只读的,因为常量是被编译器放在内存中的只读区域,当然不能够去修改。而只读变量则是在内存中开辟一个地方来存放它的值,只不过这个值不允许被修改。C语言关键字const就是用来限定一个变量不允许被改变的修饰符。

const int n = 5;   int a[n]; 

  在上面的这个例子当中,虽然变量n被修饰为一个只读变量,但是并不是常量,而数组定义的时候,规定数组长度必须是常量,所以会报错。也就是说,常量并不等于不可变的变量

 3、const来限定内容 

1 typedef char * pStr;   
2 char string[4] = "abc";  
3 const char *p1 = string; //1式   
4 const pStr p2 = string; //2式   
5 p1++;   
6 p2++; 

const使用的基本形式是:

 const type m;  // 限定m不可变。

  在第3行代码中const这个关键词修饰的是*p1,所以*p1是不可变的,但是p1是可变的,所以p1++是没有问题的

  在第4行代码中,const修饰的是p2,所以p2是不可变的,也就是说第6行的代码是错误的。

4、const vs指针

  1)const在前面

1 const int nValue; // nValue是const
2  const char *pContent; // *pContent是const, pContent可变
3  const char* const pContent;  // pContent和*pContent都是const

  2)const在后面

1 int const nValue;  // nValue是const
2 char const * pContent;  // *pContent是const, pContent可变
3 char* const pContent;  // pContent是const,*pContent可变
4 char const* const pContent;  // pContent和*pContent都是const

 1)和2)所做的声明是一样的效果

  例子: 

int const * p1,p2;

  在这里p2是const修饰的,而(*p1)是作为一个整体收到const修饰的。换句话说,也就是p1是可变的。在这个例子当中,p1是指向整形的指针,

 

——指针指向的变量不可变,但是指向可以改变

1    int x = 1;
2    int y = 2;
3    const int* px = &x;  int const* px = &x; //这两句表达式一样效果
4    px = &y; //正确,允许改变指向
5    *px = 3; //错误,不允许改变指针指向的变量的值

——指针指向的变量的值可以改变,指向不变

  

1    int x = 1;
2    int y = 2;
3    int* const px = &x;
4    px = &y; //错误,不允许改变指针指向
5    *px = 3; //正确,允许改变指针指向的变量的值

——指针指向的变量不可变,指向不可变

   int x = 1;int y = 2;const int* const px = &x;  int const* const px = &x;px = &y; //错误,不允许改变指针指向*px = 3; //错误,不允许改变指针指向的变量的值

 

5、在定义宏的时候,也可以使用const来进行定义

  在定义宏的时候,也可以使用const来进行定义宏,但是要注意一些问题。比如说,如果把const修饰的宏全部放到pch文件当中的话,会造成,项目中所有的.m文件中都会有这段声明,产生重读定义的问题,解决办法就是重新新建一个.h 和.m文件,然后在.m中定义常量,然后在.h中用extern关键字进行引用就可以了

例如:

——在.m文件中做如下定义:

1 NSString * const HWAppKey = @"3235932662";
2 NSString * const HWRedirectURI = @"http://www.baidu.com";
3 NSString * const HWAppSecret = @"227141af66d895d0dd8baca62f73b700";
4 NSString * const HWMyAge = @"20";

——在.h文件当中用extern关键字进行引用

1 extern NSString * const HWAppKey;
2 extern NSString * const HWRedirectURI;
3 extern NSString * const HWAppSecret;
4 extern NSString * const HWMyAge;

  在用到这些声明的全局变量的时候只要包含这个文件的头文件即可。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {static NSString *ID = @"cell";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];if (!cell) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];}cell.textLabel.text = [NSString stringWithFormat:@"第%ld行数据",indexPath.row];return cell;}

在使用tableViewCell 的时候经常会出现上述的写法,并且会定义一个static变量,这个变量在编译期会对这个变量进行初始化赋值,也就是说这个变量要么是nil要么就是在定义初期的时候对其进行赋值,一般情况下,只能用NSString或者是基本类型。

static修饰的变量存储在内存中的静态存储区,这块内存在程序的运行期间都会存在。所以保证了static变量的唯一性和持久性。

——static变量不能写在interface里面,会直接报错。static变量只能放在方法里面或者放在implementation外面(通常放在implementation文件开始处),

#import "Printer.h"static int pageCount;@implemenation Printer...@end

简单的来说,const是静态变量,在声明过后即存在在内存中的特殊位置,下次使用的时候,从该内存中读取上次的存储的值

 

 

参考:

http://blog.163.com/fuxiaohui@126/blog/static/13174582620139319928864/

转载于:https://www.cnblogs.com/SH9186ios/p/4649238.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux、Windows、Mac下Docker的安装与使用

Linux、Windows、Mac下Docker的安装与使用一、Linux下的安装二、Windows与Mac下的安装三、Docker的使用一、Linux下的安装 这里以Centos 7为例,首先,确保系统已经正确运行了Centos 7并已经联网。yum安装gcc环境 yum -y install gcc yum -y install gcc…

[智能架构系列]什么是Buddy智能开发框架

buddy框架,秉承国内优秀框架THINKPHP的优点并增加了很多的商业特性和集成了全版本的商业项目模块,提供给创业者一个最好的选择 组建图: 转载于:https://www.cnblogs.com/scotoma/archive/2011/10/17/2215553.html

Mac nginx PCRE install ngnix

1 下载:pcre-8.12.tar.gz ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre 2 sudo tar xvfz pcre-8.12.tar.gz 解压文件 解压完成之后,执行命令 cd pcre-8.12sudo ./configure --prefix/usr/local --enable-utf8 sudo make sudo make instal…

解决IE6下,给图片加上line-height属性不起作用的方法

在css设置中,我们一般用行高line-height来设定某一行的高度,这在ie7与firefox等浏览器都适用。但当行中有其他元素时(如图片,SPAN,li..)在IE6.0下line-height会不起效果,后来查了下资料,果然如此…

小孔子文章管理系统V2.0发布测试

小孔子文章管理系统V2.0 【感谢】 本系统是仿照nbArticle开发,在此表示感谢nb联盟的作品. 【版权声明】 本软体为开源项目,允许个人使用或修改. 非经小孔子本人授权许可,不得将之用于盈利或非盈利性的商业用途. 欢迎使…

Docker Swarm建立服务器集群

Docker Swarm建立服务器集群一、Docker Swarm简介1. 集群模式2. 管理节点--Manager二、Docker Swarm的配置及使用三、Docker Service向集群中添加服务四、Docker Stack部署集群一、Docker Swarm简介 1. 集群模式 这是Docker官网给出的一张swarm原理图,即swarm就是…

Linux下的版本升级只是浮云

ubuntu从11.04到11.10,直接系统升级,那简直是扯蛋啊 gnome 也是 从2.32到了3 ,ubuntu从此停在了11.04,对我而言。 转载于:https://www.cnblogs.com/x3d/archive/2011/10/18/2661307.html

恢复快速启动栏里的“显示桌面”图标

在百度知道上看到一个提问,大意是说自己不小心把快速启动栏的“显示桌面”图标给删除了,“显示桌面”按钮是大家经常用到的操作按钮,有时误删除掉后,然后使用起来非常不方便。 因为刚刚帮一个朋友解决了同样的问题,所以…

python常用魔法函数

1、__init__(): 所有类的超类object,有一个默认包含pass的__init__()实现,这个函数会在对象初始化的时候调用,我们可以选择实现,也可以选择不实现,一般建议是实现的,不实现对象属性就不会被初始化&#xff…

Python3.4 Django MySQL MySQL-python 安装不成功解决办法 Unable to find vcvarsall.bat 错误

解决办法: 1.安装pymysql pip install pymysql 2.在Django项目中找到跟settings.py在同一个目录下的__init__.py 添加如下代码 import pymysql pymysql.install_as_MySQLdb() 然后就解决了 ----------------------------------------------------------------------…

Go出现警告struct doesn‘t have any exported fields, nor custom marshaling

Go出现警告struct doesnt have any exported fields, nor custom marshalingGo语言要求所有结构体成员变量的首字母需要大写,如果首字母小写的话,则该字段无法被外部包访问和解析,比如,json解析。 type student struct {Id intName string…

苹果MAC系统的安装

搞Iphone开发,没有苹果系统是不行的。由于我已经装好了苹果的雪豹系统,所以在此我只是简单在说一下大休怎么装! 苹果系统,现下在非苹果机上的安装分两种:1、虚拟机安装;2、物理机安装。 现在先说延续一种&a…

asp.net 对xml文件的读写,添加,修改,删除操作

下面有代码调试正确 using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.Html…

sphinx和coreseek

sphinx是国外的一款搜索软件。 coreseek是在sphinx的基础上,增加了中文分词功能,换句话说,就是支持了中文。 Coreseek发布了3.2.14版本和4.1版本,其中的3.2.14版本是2010年发布的,它是基于Sphinx0.9.9搜索引擎的。而4.…

Spring security/Shiro ---登陆成功后返回登陆前界面<页面重定向>

Spring security ---登陆成功后返回登陆前界面<页面重定向>问题&#xff1a;在登陆/退出成功后&#xff0c;我们往往通过http.formLogin().successForwardUrl()和http.logout().logoutSuccessUrl()设定操作成功后的回跳页面。我们现在希望在任意界面跳转到登陆界面后&…

linux下编译的PHP添加soap扩展

# 进入源码cd /opt/php-5.5.17/# 进入扩展cd /ext/soap# PHP之前是编译好的&#xff0c;有phpize&#xff0c;用它生成configure文件。/usr/local/php-5.5.17/bin/phpize# 执行configure&#xff0c;之前编译好的PHP一定要有php-config./configure --with-php-config/usr/local…

针对plsql developer使用做的三个小设置

来自&#xff1a;http://www.cnblogs.com/william-lee/archive/2010/12/08/1900176.html 1、原来大家在sql窗口写多条sql语句&#xff0c;如果点击“执行”&#xff0c;那么会执行窗口下的所有语句&#xff0c;如果向执行所要的语句&#xff0c;必须选定它。 那么&#xff0c;有…

asp.net导出Excel类库

using System; using System.Collections.Generic; using System.Reflection; using System.Web; using Excel Microsoft.Office.Interop.Excel; /// <summary> ///ExcelClass 的摘要说明 /// </summary> public class ExcelClass { /// <su…

今天将Notebook还原了, 第一次外加了外围电路

因为天气太热了, 我的Aspire 5502出了问题, 用Ghost还原中途死机, 找了问题原来是太热了....又在宿舍, 没有空调, 又不想去图书馆, 最后就问奶仔借了部风扇, 总算搞掂了...相机太快了....看上去风扇好像停了....不仅有风扇, 它还要裸跑才能胜利还原....温度一高就自动关机了...…

SpringBoot生成日志文件---logback和log4j

SpringBoot生成日志文件---logback和log4j一、logbacklogback是SpringBoot自带的日志文件&#xff0c;默认会为控制台输出INFO级别的日志&#xff0c;并且不会将日志文件保存。如果我们只需要输出日志到文件&#xff0c;直接给application.yml中添加如下配置&#xff0c;对应日…