• c语言笔记


    高级用法

    contain_of

    #define container_of(ptr, type, member) 
    do { 
    typeof(((type*)0)->member) * mptr = (ptr);
    (type*)((char*)mptr - offset(type, member)) 
    }while(0);
    

    关键字

    static

    • 表示存储状态 : 带static的变量在进程活着时 一直有效
    • 表示作用域 : 作用在函数或变量时,表示其他文件无法访问

    sizeof

    sizeof(type) sizeof(var) sizeof var都可以

    • 作用在基本类型如char, int时,大小就是其实现的大小,如1, 4
    • 作用在指针时,就是其实现大小,如64位,8字节
    • 作用于数组时,是整个数组占用字节数
    • 作用于Union时,表示最大字节数

    extern

    声明变量或函数为外部变量

    注意即使在同一个文件中,在文件后半部分定义的,在文件前半部分使用也不行
    extern int num = 3这种写法是错的,应该写为extern int num

    typedef

    给已存在类型取别名 typedef oldName newName;

    typedef struct student {
          // ...
    } Stu, *Stu_p;
    

    struct student 等同 Stu
    struct student * 等同 Stu*, Stu_p

    typedef char ARRCH[20]
    ARRCH 等同于 char[20]
    ARRCH a, b 等同于 char a[20], b[20]

    更多阅读
    C语言typedef:给类型起一个别名

    函数与指针

    函数指针与函数声明一样,只需要简单修改一下如下:

    void myFunc(int);
    void (*Func)(int); // 申明一个函数指针变量,变量名是Func
    typedef void (*FuncType)(int); // 定义一个函数指针类型,类型名为FuncType
    
    void myFunc(int x) {
          //...
    }
    
    Func = myFunc;  // 正确
    
    FuncType f = myFunc ; // 正确
    

    更多阅读
    c/c++ 函数指针的用法

    数组与指针

    指向数组的指针 与 指针数组

    char *p[20]char (*p)[20]两者区别??
    []优先级高于*,所以前者是定义了一个变量数组p,其元素是char*类型;而后者是定义了一个指针变量p,其指向包含20个元素的char数组。

    extern 数组

    a.c中定义char arr[20],b.c中extern char* arr可以吗??
    不可以,指针就是指针,数组就是数组,不一样的类型

    数组

    int arr[5]arr&arr&arr[0]作为右值时表示什么
    &arr表示数据地址,另外两个表示数组首元素地址

    int main() {
          int arr[5] = {1, 2, 3, 4, 5};
          int* ptr = (int*)(&a + 1);
          printf("%d, %d
    ", *(arr+1), *(ptr-1));
    }
    

    输出是啥
    2, 5

    内存管理

    int arr1[128] = {0}; //全局变量
    int arr2[128] = {1}; //全局变量
    int arr3[128] = {}; //全局变量
    int a;
    int b = 0;
    static int c;
    static int c = 1;
    
    int main(){
          int arr4[5] = {0};
          int arr5[5] = {1};
          int arr6[5] = {};
          int arr7[5];
    
          return 0;
    }
    

    数据分为bss和data两个段,前者存储代码中没有初始化的全局变量和静态变量,并为之赋值0;后者存储代码中主动赋值了的全局变量和静态变量.

    C语言的内存布局(详细分析变量在.bss和DS段的分布)

  • 相关阅读:
    (转) 将VB.NET网站转换成C#的全过程
    vb.net转换为C#方法
    (转)使用Microsoft Web Application Stress Tool对web进行压力测试
    (转)js 中{},[]中括号,大括号使用详解
    (转)js学习笔记()函数
    (转)几种HtmlEncode的区别
    编译Redis系统提示缺少gcc,可以使用yum进行安装:
    linux如何关闭防火墙
    Linux less命令简介
    Linux unzip解压文件到某个目录下面
  • 原文地址:https://www.cnblogs.com/holidays/p/cnote.html
Copyright © 2020-2023  润新知