原文:http://www.noxeos.com/2011/07/29/c-const-static-keywords/

C: const and static keywords

Ok, once and for all, I’ll try to clarify to meaning of the ‘const’ and ‘static’ keywords in C (it applies to Objective-C and C++ too).

I’m just tired of questions about this on StackOverflow.

Objective-C programmers usually don’t think about C code while coding. I personally think this is a big mistake (it can sometimes apply to C++ programmers too).

Objective-C is just a layer over C. So in order to be a good Objective-C programmer, you HAVE to know at least a few things about the C language.

I don’t know why C has such a bad reputation for Objective-C coders, especially on iOS. And it’s very surprising to see the lack of knowledge of some Objective-C developers.

So once and for all:

If you want to code in Objective-C, learn at least the following C topics:

  • Language keywords and their meanings
  • Pointers and pointer arithmetic
  • C standard library

Those are the (very) basics.

Objective-C is a very nice object-oriented language, with amazing runtime capabilities. That’s true.
But it doesn’t mean you can bypass completely the C language.
A lot of time, you’ll save a lot of processor time and memory, just by knowing a few things about the C language, rather than relying on the apparent simplicity of the Objective-C language.

But that’s a different story. Now back on our keywords…

const

First of all, the ‘const’ keyword.

Ok, it means ‘constant’… So:

const int x = 42;

declares a constant integer variable. It means it’s value can’t be modified. It’s value is initially assigned to 42.
If you try to change its value later, the compiler will issue a warning, or an error, depending on your compiler settings.
So the following statement is invalid:

const int x = 42;
x = 43;

That’s pretty easy to understand.
The problem comes with pointers.

Let’s take a look at the following code:

char * str = "hello, world";

It declares a ‘char’ pointer. Ok… But then what about this:

char * const str = "hello, world";

or

const char * str = "hello, world";

Now read carefully.
The first one declares a constant pointer to a char.

It means the the characters of the string can be modified, but not the pointer value.
So the variable ‘str’ cannot be assigned to another pointer.

For instance, this is invalid:

char * hello = "hello, universe";
char * const str = "hello, world";
str = hello;

as your a modifying the pointer value (not the string value).

This is valid:

char * const str = strdup( "hello, world" );
str[ 0 ] = 'a';

The ‘str’ variable will then contain ‘hello, world’. Remember: the pointer can’t be modified, the value that is pointed can be.

It’s the exact opposite with the following notation:

const char * str = "hello, world";

Here, you can assign the pointer to another variable, but you can’t change the value.

The ‘const’ keyword is contextual, in a way, when using pointers. It can apply to the pointer itself, or to the value pointed.

So, in order to resume:

const int * x;

A modifiable pointer to a constant integer.

int * const x;

A constant pointer to an modifiable integer.

const int * const x;

A constant pointer to a constant integer.

static

The static keyword can have two meanings.

First of all, it can be declared inside a function.
Let's take a look at this example:

#include <stdio.h>

void foo( void );
void bar( void );

void foo( void )
{
int x = 0;

printf( "X - foo: %i\n", x );

x++;
}

void bar( void )
{
static int x = 0;

printf( "X - bar: %i\n", x );

x++;
}

int main( void )
{
foo();
foo();
foo();
bar();
bar();
bar();

return 0;
}

The output will be:

X - foo: 0
X - foo: 0
X - foo: 0
X - bar: 0
X - bar: 1
X - bar: 2

Because a simple local variable, as in the 'foo' function, only exists when the function is called. It's destroyed (to be simple) when the function exits.

So for the 'foo' function, the variable is created each time the function is called, with a value of '0'. The value is printed, then incremented.
The function then exit, and the variable is destroyed.

But in the 'bar' function, the variable is declared as static. It means the value will persist across function calls.
It's initialized the first time the function is called, but only at that time. Once it has been initialized, it just exist, so its value will be taken for the next function calls.

Now the 'static' keyword as a completely different meaning when used in a variable declared outside of a function (in the global scope).

It means that the variable will be «file scoped». In other words, the variable, which is global, will be accessible only from the scope of the file which declared it. It won't be accessible from other files.

It's just a way to create global private variable.

For instance, imagine a file called 'foo.c':

int x = 42;
static int y = 42;

From a 'bar.c' file, you'll be able to access the 'x' symbol, if both files are linked together. But you won't be able to access the 'y' symbol, as it's decaled as 'static'.
It means that the symbol for the 'y' variable won't be exported by the linker, when the symbol for the 'x' variable will be.

In other words, you'll be able to access the 'y' global variable only from function declared in the 'foo.c' file. The 'x' variable will be also accessible from other files.

Of course, the 'static' keyword can be combined with const.
For instance:

static const int * const y;

A constant pointer to a constant integer, that will be accessible only from the file which declared it.

C: const and static keywords的更多相关文章

  1. const extern static 终极指南

    const extern static 终极指南 不管是从事哪种语言的开发工作,const extern static 这三个关键字的用法和原理都是我们必须明白的.本文将对此做出非常详细的讲解. co ...

  2. const、static和extern的正确使用方式

    我们在看一些大牛的第三方时,里面会出现很多const.static和extern,尤其是const和static,const和extern的结合使用,直接令很多小伙伴懵逼了,今天就详细讲解一下这三个关 ...

  3. 《OOC》笔记(1)——C语言const、static和extern的用法

    <OOC>笔记(1)——C语言const.static和extern的用法 C语言中const关键字用法不少,我只喜欢两种用法.一是用于修饰函数形参,二是用于修饰全局变量和局部变量. 用c ...

  4. 到底是 const 还是 static readonly

    真的一样? const 和 static readonly 常在程序中用来声明常量,调用方法也没有什么不同,他们真的一样吗?我们可以做个试验. 程序集内的常量 现在我们建立一个程序,里面有一个MyCl ...

  5. 【转】const和static readonly

    我们都知道,const和static readonly的确很像:通过类名而不是对象名进行访问,在程序中只读等等.在多数情况下可以混用.二者本质的区别在于,const的值是在编译期间确定的,因此只能在声 ...

  6. (C#) What is the difference between "const" and "static readonly" ?

    const int a must be initialized initialization must be at compile time readonly int a can use defaul ...

  7. (转) C++ static、const和static const 以及它们的初始化

    const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. static表示的是静态的.类的静态成员函数.静态成员变量是和类相关的,而不是和类的 ...

  8. C# const与static的理解

    C#  const与static的理解 static readonly与 const变量,作用是一样的,无论访问修饰符是不是public,还是其它(private. protected.interna ...

  9. c#中const、static、readonly的区别

    1. const与readonly const ,其修饰的字段只能在自身声明时初始化. Readonly 是只读变量,属于运行时变量,可以在类初始化的时候改变它的值.该类型的字段,可以在声明或构造函数 ...

随机推荐

  1. CI 框架去掉url 中index.php的方法

    1 修改 apache 的 httpd.conf 文件 #LoadModule rewrite_module modules/mod_rewrite.so 去掉前面的# 2 找到 你程序目录下的 .h ...

  2. Android SDK Manager无法显示可供下载的未安装SDK解决方案

    FAQ: 问下的 我的ANDROID SDK MANAGER里原来下载了一些SDK,但是我现在想重新下载新的SDK,咋Packages列表没显示呢?该怎么办? Answer: 据说dl-ssl.goo ...

  3. D3D11中的MSAA

    这两年我的工作都转到了D3D11,目前新出硬件几乎全部支持此标准,加上D3D11接口清晰,概念直观,等到windows7普及,想必未来都是D3D11的天下.最近时间较空,我陆续开始写些基础文章,希望对 ...

  4. 使用docker搭建nfs实现容器间共享文件

    首先介绍下今天的两个主角:nfs和docker nfs 是什么 NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TC ...

  5. Eclipse项目名出现红叉

    一.背景与原因 项目第一次加进来的时候,我用的是D:\Java\jdk1.7.0_17,后来由于配置将tomcat切换到jboss,说是JBOSS某个版本只支持jdk6,我就将“环境变量JAVA_HO ...

  6. windows下面go语言环境搭建

    步骤一:golang下载 下载地址是:http://www.golangtc.com/download 下载完成之后解压缩,放到你的c:/根目录下面.然后配置一下环境变量! 环境变量配置如下: 1.新 ...

  7. Origami – 用于 Quartz 的免费的交互设计框架

    Origami 是一个为 Quartz Composer 开发的免费的工具包——由Facebook设计团队创建,让交互设计原型更加简单,不需要编程. 如今,大多数设计师通过创建静态原型来表达要实现的应 ...

  8. 分享一套精美的现代 UI PSD 工具包【免费下载】

    艾库特·耶尔马兹,是土耳其伊斯坦布尔的一位高级艺术总监,他向大家分享了一套美丽的现代 UI 工具包,你可以免费下载.所以,你可以使用这个优秀的素材设计视觉互动和有吸引力的用户界面. 此 UI 套件提供 ...

  9. 利用栈实现算术表达式求值(Java语言描述)

    利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...

  10. 订餐APP第一次sprint+燃尽图

    MY-HR 成员: 角色分配 学号 博客园 团队贡献分 丘惠敏 PM项目经理 201406114203 http://www.cnblogs.com/qiuhuimin/ 19 郭明茵 用户 2014 ...