1 定义声明最重要的区别是 :定义创建了对象并且为其分配了内存。 声明没有分配内存。
2 reigster
最快的关键字 请求编译器尽可能的将变量存放在CPU的寄存器中,以提高效率,是尽可能 ,不是绝对。
3 static
修饰变量 :静态全局变量作用域仅限于变量被定义的文件中,(定义的开始出到文件的结束 或者是使用之前再加上extern *)
静态局部变量,定义在函数体内,只是应用于这个函数体内。即使函数运行结束,静态变量的值还是不会被销毁,函数下次使用时仍然能用到这个值。
例如:
#include<stdio.h>
static int j;
int fun1(void)
{
static int i = 0;
i++;
return i;
}
int fun2(void)
{
j = 0;
j++;
return j;
}
int main()
{
int reti,retj;
for(int k=0;k<10;k++)
{
reti = fun1();
retj = fun2();
}
printf("i = %d, j = %d\n",reti,retj);
return 0;
}
请问 i?j?
i = 10, j = 1
4 变量的命名的规则
1)命名直观,可望文生义,不允许使用拼音
2)命名的长度应当符合“min-length&&max-information”原则
3)单词由多个单词组成时候,每个单词的字母应该大写,
4)尽量避免名字中出现数字编号,除非逻辑上需要编号
5)一个函数名禁止被用于其他处
6)定义变量的时候千万不要忘记初始化,定义变量时编译器不一定清空了这块内存,他的值可能是无效的值。
7)不同类型的数据之间的运算要注意精度的扩展问题,一般是低精度向高精度扩展。
5 最冤枉的关键字–sizeof
sizeof() 不是函数是
int i;
sizeof(int)and sizeof(i)and sizeof i 值等于4
但是 sizeof int 就不行
总结 :sizeof 在计算“”变-量“”的时候可以省略括号
但是在计算类型的时候是不能省略括号的;
sizeof(int)*p 表示什么意思?
(在32位系统中指针占用4个字节 在64位系统中占用8位)
int *p = nULL;
int a[100];
sizeof(p) 8
sizeof(*p) 4 //只是求第一个值的占用内存大小
sizeof(a) 400
sizeof(a[100]) 4 //只是在求第100 位的大小
6 bool
最好的格式是 if(test) || if (!test)
7 int *p = NULL
最好的判断是 : if(NULL==p) ||if (NULL !=p )
8 switch
case :后面只能是整形或是字符常量或是常量表达式(想想字符类型在内存中是怎么存的)
9 循环语句
for 循环嵌套的时候尽可能的将 短的循环放在最外层 将长的放在内循环(减少cpu 跨切循环层的次数 提高效率)
10 void的空指针
void *pvoid
pvoid ++ ANSI错误 但是在GNU正确
pvoid+=1 ANSI错误 但是在GNU正确
解释:不能对void 指针进行算法操作 都是不合法的 (进行算法操作必须知道数据的类型的大小)
11对内存的操作
memset :接收一切类型的指针
memset(数组名,设成的值,字节长度)
memcpy(目的地址,源地址,字节长度)
12 const
const int Max=100
int Array[Max];
解释;在C语言中会有报错,(我们知道在定义数组的时候要确定数组的长度),所以在C语言中还是只读属性,仍然是变量。
但是在c++中就不会报错,c++编译器做了扩充。(从汇编的角度看的话就是,const只是给出了对应的内存地址)
指针修饰:
const int *p //p可变,p指向的对象不可变
int const *p //p可变 ,p指向的对象不可变
int * const p //p不可变,对象可变
const int *const p //p不可变,对象也不可变
记忆方法:思想是近水楼台先得月 将类型去掉 修饰谁谁就是不能改变
13 最易变得关键字 —volatile
主要是告诉编译器要不要去优化代码
int i=10;
int j = i;
int k = i;
解释过程:在内存中首先将i的值赋值给j,但是并没有将其丢掉,在将j赋值给k ,提高了效率
volatile int i=10;
int j = i;
int k = i ;
解释过程;volatile关键字就是告诉编译器i的值随时会发生改变,每次用它的时候都要从内存中取出来。(内存不能偷懒)
const volatile int i= 10;实际上此声明表示的申明了一个const int型的变量,所以i是只读变量,不能被修改。同时i又被volatile修饰了,意思就是说不允许编译器优化代码,在代码中每次用到i时都要直接从内存中去取数。
所以,虽然const volatile int i = 10;定义没错,但是这样的定义没有什么实际的意义。
14 struct关键字
struct student
{
}stu;
sizeof(stu) = 1 结构体类型不管什么样子 其占有内存最小是1byte
15 注释的奥妙
当C语言处理注释的时候是 将注释的部分用空格来替换,并不是全部删除
16 #号预算符
#也是预处理:#define P(x) printf(“this is “#x” \n”,x);
P(8);
结果: this is 8
##号
#define xname(n) x##n
xname(8)
结果:x8