美文网首页
C/C++基础知识(一)——函数和结构体

C/C++基础知识(一)——函数和结构体

作者: 王志强_9380 | 来源:发表于2019-10-12 17:11 被阅读0次

    指针函数

    定义:指针函数是指带指针的函数,本质是一个函数。函数返回类型是某一类型的指针
    int *f(x, y);

    例子

    int* func_point(void* mParam) {
        printf("指针函数 \n");
        int b = 10;
        int* p = &b;
        return p;
    }
    
    int a = 10;
    func_point(&a);
    

    函数指针

    定义:函数指针是指向函数的指针变量,本质是一个指针变量
    int(*f)(int x);
    f = func;

    例子

    void (*funcp)();
    void funcp_point() {
        printf("函数指针 \n");
        return;
    }
    funcp = funcp_point;
    

    指针数组

    *p[n]

    void func_pointarr1() {
        printf("指针数组 \n");
        int arr[] = { 100, 200, 300 };
        int* p[3];
        for (int i = 0; i < 3; i++) {
            p[i] = &arr[i];
        }
    
        for (int i = 0; i < 3; i++) {
            printf("*p[%d]=%d \n", i, *p[i]);
        }
    }
    

    输出结果为:
    指针数组
    *p[0]=100
    *p[1]=200
    *p[2]=300

    数组指针

    int (*p)[n]
    也称为行为指针,优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个数组的长度是n,也就是说这个n是p的步长。当执行p+1时,p要跨过n个整型数据的长度

    int a[3][4];
    int (*p)[4];//定义一个数组指针,指向含4个元素的一维数组
    p=a;  //将二维数组首地址赋值给p,也就是a[0]或&a[0][0]
    p++;  //执行之后,指向了a[1][]
    

    内存对齐

    对齐跟数据在内存中的位置有关,如果一个变量的内存地址正好位于它长度的整数倍,他就被称作自然对其。比如在32位cpu下,假设一个整型变量地址为0x00000004,那它就是自然对齐的

    结构体

    结构体存储原则

    • 结构体变量中成员的偏移量必须是成员大小的整数倍
    • 结构体大小必须是所有成员大小的整数倍,也就是所有成员大小的公倍数
    struct MyStruct
    {
        int a;
        short b;
    } s1, s2;
    
    void func_struct() {
    
        MyStruct myStruct;
        myStruct.a = 1;
        myStruct.b = 2;
    
        s1.a = 11;
        s1.b = 22;
    
        s2.a = 33;
        s2.a = 44;
    
        printf("结构体大小:%d \n", sizeof(MyStruct));
    }
    

    输出结果为:
    结构体大小:8

    共用体

    共用体是一种特殊的数据类型,允许你在相同内存位置存储不同的数据类型。可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式

    union UnionData
    {
        int a;
        int c;
        float b;
        char str[20];
    };
    
    void func_union() {
        UnionData unionData;
        unionData.a = 1;
        printf("unionData.a:%d \n", unionData.a);
        unionData.c = 2;
        printf("unionData.a:%d \n", unionData.a);
        printf("共用体大小:%d \n", sizeof(UnionData));
        printf("共用体a地址:%#x \n", &unionData.a);
        printf("共用体b地址:%#x \n", &unionData.b);
    }
    

    输出结果为:
    unionData.a:1
    unionData.a:2
    共用体大小:20
    共用体a地址:0x268ff968
    共用体b地址:0x268ff968

    相关文章

      网友评论

          本文标题:C/C++基础知识(一)——函数和结构体

          本文链接:https://www.haomeiwen.com/subject/gocypctx.html