定义和声明
定义和声明的最大区别在于:
定义创建了变量(对象)并为这个对象分配了内存。
声明:只是告诉编译器这个变量名被提前预定了
关键
register
要求编译器尽可能的将变量放在CPU内部寄存器中,而不会是通过内存寻址访问以提高效率。
break
可以跳出所有循环 。 do while . while . for
循环语句的主要点,建议把最长的循环放在最内层,最短的循环放在最外层,减少少CPU跨切循环层的次数
void
真正发挥的作用在于
对函数返回的限定
对函数参数的限定
void *
,任何类型的指针都可以直接赋值给他无需强制转换;
void *p1;
int *p2;
p1 = p2; //正确
p2 = p1; //错误
如果函数没有返回值,那么声明应该为 void
类型。
在C语言中,凡是不加返回值类型限定的函数,就会被编译器作为返回整型值处理。但是很多时候都被误以为void
void 指针
使用void 指针类型要非常小心。
按照 ANSI(American National Standards Institute)
标准,不能对void指针进行算法操作,
void * pvoid;
pvoid++; //不合法
pvoid += 1; //不合法
原因是:ANSI
认为进行算法操作的指针必须是确定知道其指向数据类型大小的,也就是说必须知道内存目的地址的却切值。
GNU
却认为 void*
的算法操作和 char *
一致
void * pvoid;
pvoid++; //合法
pvoid += 1; //合法
如果函数的参数可以是任意类型的指针,那么应声明其参数为void*
例如内存操作函数 memcpy()和memset()
void * memccpy(void* dest,const void *src,size_t len);
void * memset(void * buffer, int c, size_t num);
void
不能代表一个真实的变量,因为定义变量时必须分配内存空间。
void a // error
function(void a);// 错误
局部变量,位于栈内存中,在函数结束后,就被释放
const
const
也许被称为 readonly
才对 只读变量
修饰一般变量
int const i = 2; 或 const int i = 2; //都可以
修饰数组
int const a[5] = {1,2,3,4,5}; 或
const int a[5] = {1,2,3,4,5};
修饰指针
const int *p ; //p可变,P指向的对象不可变
int const *p ; //p可变,P指向的对象不可变
int *const p; // p不可变,P指向的对象可变
const int *const p; //指针p和P指向的对象都不可变
记忆方法,先忽略类型名,(编译器解析的时候也是忽略类型名的)
const 离那个近,就修饰谁,谁就不可以改变
const 修饰函数参数,起到保护作用,避免参数被函数体内意外改变。
void Fun(const int i);//i 在函数体中不能被改变。
const 修饰函数的返回值,这样返回值不可被改变,达到保护的目的。
例如
const intFun(void);
在另一文件中引用const只读变量:
extern const int i; //正确的声明
extern cons int j = 10; // 错误,只读变量不能被改变