Men的博客

欢迎光临!

0%

C语言中的关键字

一 const 修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。

const关键字的作用主要有以下几点:
(1)可以定义const常量,具有不可变性。 例如:
const int Max=100; int Array[Max];
(2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。例如: void f(const int i) { ………} 编译器就会知道i是一个常量,不允许修改;
(3)可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。
(4)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。 还是上面的例子,如果在函数体内修改了i,编译器就会报错; 例如:
void f(const int i) { i=10;//error! }
(5) 为函数重载提供了一个参考。
class A { ……
void f(int i) {……} //一个函数
void f(int i) const {……} //上一个函数的重载 ……
};
(6) 可以节省空间,避免不必要的内存分配。 例如:
#define PI 3.14159 //常量宏
const doulbe Pi=3.14159; //此时并未将Pi放入ROM中 ……
double i=Pi; //此时为Pi分配内存,以后不再分配!
double I=PI; //编译期间进行宏替换,分配内存
double j=Pi; //没有内存分配
double J=PI; //再进行宏替换,又一次分配内存!
const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。
(7) 提高了效率。 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

二 外部变量,局部变量以及extern,static关键字

1)外部变量又叫全局变量,管全局变量叫外部变量是因为该变量在函数外部声明
(1)全局变量在声明的时候初始化,那么该全局变量的值为被初始化的那个值全局变量在声明的时候若未初始化,那么系统会自动把它初始化为0.
(2)全局变量的作用域:是从全局变量声明到该文件的结尾
(3)如果在一个全局变量的作用域内的函数里面声明一个局部变量跟全局变量的名字相同,在该函数内全局变量是不可见的,用的只是那个局部变量。也可以说这个相同名字的局部变量在该变量作用域内会屏蔽掉那个全局变量
注意:全局变量是很危险的,因为任何一个函数都有可能改掉该全局变量,而造成不可预期的错误。可以用const这个关键字来修饰一个全局变量而使其成为一个只读变量,这样可以避免全局变量所遇到到一些危险操作。
2)局部变量:auto自动变量,平时在声明一个变量的时候若是不加该关键字,系统默认成自动变量,例如:
int a;
虽然没有加auto关键字,但是系统已经认为他是auto类型的变量。
(1)局部变量的作用域仅限于该变量在某一个代码块内声明到该代码块退出,当然作用域也是变量的生存周期。例如:

三 extern关键字

(1)当前文件用到其他文件中的全局变量
extern int my_global;
(2)使用当前文件里所没有的函数,而使用的函数是在别的文件里定义的,需要声明
该函数是其他文件里的函数,而在当前文件如下声明:
extern char *my_strcpy(char *str1,const char *str2);
4)static关键字,一般管static修饰的变量叫做静态变量,static修饰的函数叫做静态函数。
static代表什么意思呢?
1)如果是static 修饰的是变量,那么它说明该变量只能在当前文件里用,而外部其他
文件则不能通过外部链接来使用该变量。例如:

/file1.c/

static int my_static_variable=12;

/file2.c/
extern int my_static_variable; //这一条语句符合语法要求,因为任何一
个文件都有权利引用外部链接的一个变量
int main(void)
{
printf(“%d\n”,my_static_variable); //这条语句会有错误,因为这两个
文件里找不到对第二个文件可用的
my_static_variable变量.
return 0;
}
file2.c这种声明方式是没有问题的,但在用my_static_variable时却找不到该变量。
因为在file1.c里面我把my_static_variable 变量声明为了静态变量,表示该变量的
作用域只能在file1.c文件生效,其他文件不能在通过外部链接使用该变量。
2)static修饰函数时,表示该函数只在=当前文件生效,而通过外部链接是找不到的该
函数的,具体的情况描述同1)相同。

四 随机数相关函数和动态内存分配

1)随机数
srand(time(NULL));
sroand以时间设置一个种子
rand()
rand()通过一个算法计算得到一个很大的数如果生成的这个随机数在某个范围内,例如:骰子能表达的数是1-6,那我我用随机数产生的数据应该是1-6,按照下面的方法得到
n=rand()%6+1;
2)动态内存分配
void 修饰函数表示函数没有返回值
void *修饰返回值表示函数的返回值为任意指针类型(char *,int *,double *,struct book *)
void *malloc(size_t size);
char *p;
p=malloc(100);
if(p==NULL)
{
printf(“malloc failed!\n”);
return -1;
}
malloc执行成功的时候,用完这块内存,我们需要手动的释放掉该内存。因为操作系统不会帮我们释放掉在堆空间申请的内存。程序员可以用free()函数来释放掉我们手动申请的内存。例如把上面的内存释放掉可以用
下述方法:
free(p);