c语言常用关键字总结

转载说明出处:http://blog.csdn.net/mylinchi/article/details/78352977

1.auto

告诉编译器,该变量由你自动分配空间,意味着编译器按照自己的规则,自动在内存空间内分配内存盛放此变量。

2.const

告诉编译器,该变量的值不能被改变(如果修改了在编译阶段不能通过,增强程序的健壮性)。

    ①修饰局部变量,以下两种方法等价。

const int n=5;
int const n=5;

 
 
  • 1
  • 2
  • 3

      ②常量指针与指针常量

          常量指针指针指向的内容是常量。有以下两种定义方式。

const int * n;
int const * n;

 
 
  • 1
  • 2
  • 3

          常量指针说的是不能通过这个指针改变变量的值,但是还是可以通过其他的引用来改变变量的值的。

int a=5;
const int* n=&a;
a=6;

 
 
  • 1
  • 2
  • 3
  • 4

        指针常量指针本身是个常量,指向地址不能改。如下:

int *const n;

 
 
  • 1
  • 2

         指向常量的常指针以上两种的结合,指针指向的位置不能改变并且也不能通过这个指针改变变量的值。

const int* const p;

 
 
  • 1
  • 2

         ③修饰函数的参数

            根据常量指针与指针常量,const修饰函数的参数也是分为三种情况

            1)防止修改指针指向的内容

void StringCopy(char *strDestination, const char *strSource);

 
 
  • 1
  • 2

                 其中 strSource 是输入参数,strDestination 是输出参数。给 strSource 加上 const 修饰后,如果函数体内的语句试图改动               strSource 的内容,编译器将指出错误。

            2)防止修改指针指向的地址

void swap ( int * const p1 , int * const p2 )

 
 
  • 1
  • 2

                 指针p1和指针p2指向的地址都不能修改。

            3)以上两种的结合。

          ④修饰函数的返回值

      如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。 
例如函数

const char * GetString(void);

 
 
  • 1
  • 2

如下语句将出现编译错误:

char *str = GetString();

 
 
  • 1
  • 2

正确的用法是

const char *str = GetString();

 
 
  • 1
  • 2

           ⑤修饰全局变量

        全局变量的作用域是整个文件,为避免因修改全局变量而导致的bug,我们应该尽量的使用const修饰符进行修饰。

3.extern

       告诉编译器,找不到的符号(变量,结构体,函数名)可以去别的源文件找。也就是说该变量可能在当前目录下所有源文件作为全局变量声明定义,也包括当前文件。变量用法如下所示(结构体,函数名等类似):

main.c

#include<stdio.h>

int main()
{
    extern int num;
    printf("%d",num);
    return 0;
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

b.c

#include<stdio.h>

int num = 5;

void func()
{
    printf("fun in a.c");
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

       另外,extern关键字只需要指明类型和变量名就行了,不能再重新赋值,初始化需要在原文件所在处进行,如果不进行初始化的话,全局变量会被编译器自动初始化为0。像这种写法是不行的。

extern int num=4;
 
 
  • 1
如果需要将num声明为常量,则main.c的第5行改为extern const int num,b.c的第3行改为const int num = 5。

4.register

        告诉编译器,该变量经常用到,尽可能放在寄存器中。使用该关键字时要要注意:

①register变量必须是能被CPU接受的类型,即必须是单个值,且长度小于或等于整型长度。

②不能用“&”获取register变量的地址。

③随着编译程序设计技术的进步,在决定哪些变量应该被存到寄存器中时,现在的C编译环境能比程序员做出更好的选择。因此尽管它完全合法,但仅仅是暗示而不是命令。

5.static

       告诉编译器,如果它修饰的是局部变量,该变量将放入静态存储区,且只能初始化一次。如果修饰的是函数或者全局量,那个只能在当前文件使用函数或者全局变量。计算阶乘的程序如下:

#include<stdio.h>

static int fac(int n)
{
  static int f=1;
  f=f*n;
  return(f);
}

int main()
{
    int i;
    for(i=1;i<=5;i++)
    printf("%d!=%d\n",i,fac(i));
    return 0;
}
6.volatile

       告诉编译器,该变量不光软件会改,硬件也会改,因此CPU不能从cache里读取数值,要到所在内存读取数据。
7.inline

       告诉编译器,该函数是内联函数。就像宏一样,在编译时用函数体替换函数的调用。

①inline必须与函数定义放在一块,修饰函数的声明是没有任何意义的。

②内联函数只适合于简单的代码,没有while,switch等结构控制语句,并且不是递归函数。

③inline的使用会增加代码量,消耗更多的内存。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值