C 语言深度剖析个人简单笔记

版权声明:转载请注明出处 https://blog.csdn.net/qq_37689106/article/details/81590354

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 在计算“”变-量“”的时候可以省略括号
但是在计算类型的时候是不能省略括号的;

sizeofint)*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

猜你喜欢

转载自blog.csdn.net/qq_37689106/article/details/81590354