C基础

作者: 王多鱼2 | 来源:发表于2020-10-24 12:18 被阅读0次

    前言:只会列举常用的,用不到的就不写了,太多了,学不过来;

    一,数据类型

    image.png

    1. 结构体

    // 结构体
    typedef struct {
        unsigned int a; //unsigned无符号类型 正数
        int b;
    } Person;
    
    int main() {
    
        Person *person = malloc(sizeof(Person));
        person->a = 33;
        person->b = 22;
    
        printf("-----%d\n",person->a);
        printf("-----%d\n",person->b);
        return 0;
    }
    

    2.指针

    int *p 在左侧 表示的声明一个地址变量 存的是地址

    *p 在右侧 取的是一个指针变量地址 所指向的值,输出的是一个值

    // 指针
    //1, int *p 在左侧  表示的声明一个地址变量 存的是地址
    //2, *p 在右侧  取的是一个指针变量地址 所指向的值,输出的是一个值
    
    void test01() {
        int *p = 99;  //  *p 定义的是一个指针; 99指的是一个地址
        printf("------ %d\n", p);
        printf("------ %d\n", *p); //所以*p 是找不到值的
    
        //运行打印
        //------ 99
        //
        //Process finished with exit code -1073741819 (0xC0000005)
    }
    
    • & 表示含义
    //  * & 表示含义
    void test02() {
        int *p;      //  *p 定义的是一个指针;
        int a = 10;  //  定义一个实体int变量 a,取值 为10;
    
        p = &a;      //  p  取a的地址赋值给p
    
        printf("------&a %p\n", &a);
        printf("------p  %p\n", p);
        printf("------&p %p\n", &p);
        printf("------*p %d\n", *p); //这里应该是10
    
        //运行打印
        //------ 000000000022FE14
        //------ 000000000022FE14
        //------ 10
    }
    

    指针大小 都一样大

    void test03() {
        char *p;
        int *p3;
    
        printf("------ %d\n", sizeof(p));
        printf("------ %d\n", sizeof(p3));
    
        //------ 8
        //------ 8
    }
    

    指针是有类型的;

    void test04() {
        int *p;
        *p = 100L; //demo1 运行会报错,为什么呢? *p 所指向的值是一个long类型;p是int指针
    
        // p = 100L; //demo2 为什么只有写不会错? 存的是一个地址,不是地址所指向的值;
        // 这个100L地址,具体存什么,这里是未知的
    }
    

    指针赋值问题 与步长问题

    void test05() {
        int a = 0xaabbccdd;
        int *p1 = &a;
        printf("------*p1 %x\n", *p1); //demo1 预测打印的是aabbccdd;%x表示16进制的值;
    
        char *p2 = &a; //demo2 这样行吗?char 对应a的地址指向的是个int,和test04冲突?
        //可以的,1,*p = 100L;不行的原因是,你硬要在int 类型里面放long
        //       2,而&a只是一个地址,*p2取值的时候,只会取char大小的位置的值。后面的都不要了
        printf("------&a  %d\n", &a);
        printf("------*p2 %x\n", *p2);
    
        printf("------p1 %d\n", p1);
        printf("------p2 %d\n", p2);
    
        printf("------sizeof(int)  %d\n", sizeof(int));
        printf("------sizeof(char) %d\n", sizeof(char));
    
        // 步长问题,指针类型决定步长
        printf("------p1+1 %d\n", p1 + 1); //demo3; +1 结果是加几呢? 4
        printf("------p2+1 %d\n", p2 + 1); //demo4; +1 结果是加几呢? 1
    
        //打印
        //------*p1 aabbccdd
        //------&a  2293260
        //------*p2 ffffffdd
    }
    

    3.数组指针

    //指向数组的指针(数组指针) , 一个特殊的指针,不用写*,存放的是指针类型
    //数组 = 指针 指针 = 数组
    //数组指针常量,只能取,不能再赋值

    void test06() {
        int c[9] = {1, 6, 8, 3, 5, 2, 0, 1, 9};
        printf("------c  %p\n", c);
        printf("------&c  %p\n", &c);
        printf("------&c[0]  %p\n", &c[0]);
        printf("------*c %d\n", *c);
        printf("------*(c+1) %d\n", *(c + 1));
    
        int *p = c;
        printf("------p  %p\n", p);
    
        //数组 = 指针 指针 = 数组
        for (int i = 0; i < 9; ++i) {
            printf("------p[%d]  %d\n", i, p[i]);
            printf("------p+ %d  %d\n", i, p + i);//int 的步长是4;
        }
    
        //------c  000000000022FDE0
        //------&c  000000000022FDE0
        //------&c[0]  000000000022FDE0
        //------*c 1
        //------*(c+1) 6
        //------p  000000000022FDE0
        //------p[0]  1
        //------p+ 0  2293216
        //------p[1]  6
        //------p+ 1  2293220
        //------p[2]  8
        //------p+ 2  2293224
        //------p[3]  3
        //------p+ 3  2293228
        //------p[4]  5
        //------p+ 4  2293232
        //------p[5]  2
        //------p+ 5  2293236
        //------p[6]  0
        //------p+ 6  2293240
        //------p[7]  1
        //------p+ 7  2293244
        //------p[8]  9
        //------p+ 8  2293248
    }
    

    *arr = arr[0]

    void test07() {
        int a = 10;
        int b = 20;
        int c = 30;
        int *p1 = &a;
        int *p2 = &b;
        int *p3 = &c;
        int *arr[3] = {p1, p2, p3};
    
    
        printf("------arr[0]  %d\n", arr[0]);
        printf("------*arr  %d\n", *arr); // *arr = arr[0]
        printf("------*arr[0]  %d\n", *arr[0]);
        printf("------**arr  %d\n", **arr);
    
        char *aa = arr;
        printf("------*((int *)aa)  %d\n", *((int *) aa));
    
        //------arr[0]  2293244
        //------*arr  2293244
        //------*arr[0]  10
        //------**arr  10
        //------*((int *)aa)  2293244
    }
    

    维数组

    void test08() {
        int a[] = {10,20};
        int b[] = {50};
        int c[] = {30};
        int *arr[3] = {a, b, c};
        printf("------**arr = %d\n", **arr);
    
        //打印的是20 还是50呢?
        printf("------ *(*(arr+1)) = %d\n", *(*(arr+1))); //   为什么要多个*呢,这是二维数组,不然取的是地址
    
        //------**arr = 10
        //------ *(*(arr+1)) = 2293268
    }
    

    相关文章

      网友评论

          本文标题:C基础

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