关闭

c与c++关键字的用法总结

178人阅读 评论(1) 收藏 举报
/*
1,关键字的总结
register:
(1),这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率。
(2),register定义的变量:register int num=10;不能对其取地址。即不能:int *p=&num.
const:
(1),const修饰变量,以下两种定义形式在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。


     TYPE const ValueName = value; 
     const TYPE ValueName = value;
(2),将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初始化,仅仅作为声明,编译器认为在程序其他地方进行了定义.
       extend const int ValueName = value;
(3),const创建的全局变量不能修改,const创建的临时变量可以修改:
例如:const int n=10;
void main()
{


const int m=20;
int *p=(int*)n;
int *q=(int*)m;
*p=200;//可以修改
*q=300;
(4),c语言中const int a=10;
不可以作为数组的下标,即arr[a];因为他是一个变量。
c++中可以使用。
指针使用CONST
(5)指针本身是常量不可变
(char*) const pContent;
const (char*) pContent;


(6)指针所指向的内容是常量不可变
const (char) *pContent;
(char) const *pContent;


(7)两者都不可变
const char* const pContent;
函数中使用CONST


(8)const修饰函数参数
a.传递过来的参数在函数内不可以改变(无意义,因为Var本身就是形参)


void function(const int Var);


b.参数指针所指内容为常量不可变


void function(const char* Var);


c.参数指针本身为常量不可变(也无意义,因为char* Var也是形参)


void function(char* const Var);


d.参数为引用,为了增加效率同时防止修改。修饰引用参数时:


void function(const Class& Var); //引用参数在函数内不可以改变


void function(const TYPE& Var); //引用参数在函数内为常量不可变


}
(9),const 修饰函数返回值
const修饰函数返回值其实用的并不是很多,它的含义和const修饰普通变量以及指针的含义基本相同。
a.const int fun1() //这个其实无意义,因为参数返回本身就是赋值。
b. const int * fun2() //调用时 const int *pValue = fun2();
//我们可以把fun2()看作成一个变量,即指针内容不可变。
c.int* const fun3()   //调用时 int * const pValue = fun2();
//我们可以把fun2()看作成一个变量,即指针本身不可变。
3,static:
c语言中:
(1)在C语言中,static可以用来修饰局部变量,全局变量以及函数。在不同的情况下static的作用不尽相同。
(2)修饰局部变量


一般情况下,对于局部变量是存放在栈区的,并且局部变量的生命周期在该语句块执行结束时便结束了。但是如果用static进行修饰的话,该变量便存放在静态数据区,其生命周期一直持续到整个程序执行结束。但是在这里要注意的是,虽然用static对局部变量进行修饰过后,其生命周期以及存储空间发生了变化,但是其作用域并没有改变,其仍然是一个局部变量,作用域仅限于该语句块。


在用static修饰局部变量后,该变量只在初次运行时进行初始化工作,且只进行一次。


如:


#include<stdio.h>  
void fun()  
{   
static int a=1; a++;   
printf("%d\n",a);  
}  
int main(void)  
{   
fun();   
fun();   
return 0;  
}  
程序执行结果为: 2  3


说明在第二次调用fun()函数时,a的值为2,并且没有进行初始化赋值,直接进行自运算,所以得到的结果为3.


对于静态局部变量如果没有进行初始化的话,对于整形变量系统会自动对其赋值为0,对于字符数组,会自动赋值为'\0'.


(3)修饰全局变量


对于一个全局变量,它既可以在本源文件中被访问到,也可以在同一个工程的其它源文件中被访问(只需用extern进行声明即可)。


如: 
int a=1;  
file2.c  
#include<stdio.h>  
extern int a;  
int main(void)  
{  
printf("%d\",a);  
return 0;  

则执行结果为 1


但是如果在file1.c中把int a=1改为static int a=1;


那么在file2.c是无法访问到变量a的。原因在于用static对全局变量进行修饰改变了其作用域的范围,由原来的整个工程可见变为本源文件可见。


(3)修饰函数


用static修饰函数的话,情况与修饰全局变量大同小异,就是改变了函数的作用域。
c++中:
在C++中static还具有其它功能,如果在C++中对类中的某个函数用static进行修饰,则表示该函数属于一个类而不是属于此类的任何特定对象;如果对类中的某个变量进行static修饰,表示该变量为类以及其所有的对象所有。它们在存储空间中都只存在一个副本。可以通过类和对象去调用。
4,volatile:
(1),volatile int const n=10;
编译器不会对n进行优化,
volatile int i=10;
int j = i;
...
int k = i;volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中
建议使用volatile变量的场所:
(1) 并行设备的硬件寄存器
(2) 一个中断服务子程序中会访问到的非自动变量(全局变量)
(3) 多线程应用中被几个任务共享的变量
5.typedef:
(1),typedef可以对程序进行一定的优化,例如
定义结构体:
struct stu{
int a;
int b;}
定义一个新的对象为:struct stu stu1;
如果使用typedef:
则:typedef struct stu Stu;
可以:Stu stu1;
(2);可以定义一个函数指针:
typedef int(*Pfun)(int a,int b,int c)
则*Pfun 就是一个函数指针:
6,define:
(1).简单的define定义
#define MAXTIME 1000
一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写
编译器在处理这个代码之前会对MAXTIME进行处理替换为1000。
这样的定义看起来类似于普通的常量定义CONST,但也有着不同,因为define的定义更像是简单的文本替换,
(2),define可以像函数那样接受一些参数,如下
  #define max(x,y) (x)>(y)?(x):(y);
这个定义就将返回两个数中较大的那个,看到了吗?因为这个“函数”没有类型检查,就好像一个函数模板似的,当然,它绝对没有模板那么安全就是了。可以作为一个简单的模板来使用而已。
(3).在大规模的开发过程中,特别是跨平台和系统的软件里,define最重要的功能是条件编译。
就是:
#ifdef WINDOWS
......
......
#endif
#ifdef LINUX
......
......
#endif
(4),5.如何定义宏、取消宏
//定义宏
#define [MacroName] [MacroValue]
//取消宏
#undef [MacroName]
//普通宏
#define PI (3.1415926)
带参数的宏
#define max(a,b) ((a)>(b)? (a),(b))
(5),防止一个头文件被重复包含
#ifndef COMDEF_H
#define COMDEF_H
 //头文件内容
#endif
*/
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:5192次
    • 积分:267
    • 等级:
    • 排名:千里之外
    • 原创:20篇
    • 转载:10篇
    • 译文:0篇
    • 评论:1条