美文网首页
C语言-2、数组、函数

C语言-2、数组、函数

作者: 喂_balabala | 来源:发表于2022-07-12 19:26 被阅读0次
    数组定义
    // 定义数组
    // int [] arr = {1,2,3,4}; 错误的写法
    int arr[]  = {1,2,3,4};
    
    // 遍历数组
    // 其他平台不能用 Clion能用, Linux上报错
    /*for (int i = 0; i < 4; ++i) {
    
    }*/
    
    // VS非常严格,规范,    CLion包容
    
    // Linux上没有问题,Clion没有问题,Mac没有问题
    int i = 0;
    for (i = 0; i < 4; ++i) {
        printf("%d\n", arr[i]); // 取值
    }
    
    数组的指针、内存地址、取值
    // 数组 和 指针 挂钩
    // 数组的内存地址 == 第一个元素的内存地址  == &arr
    // 数组的内存地址 == 第一个元素,不是第二个元素,也不是第n个元素
    printf("arr  =   %d\n", arr);
    printf("&arr  =   %d\n", &arr);
    printf("&arr[0]  =   %d\n", &arr[0]);
    
    // 既然数组就是一个内存地址
    int * arr_p = arr;
    
    printf("%d\n", *arr_p); // *arr_p 取出元素一内存地址的值 1
    
    arr_p ++; // 指针挪动   元素二的内存地址了
    
    printf("%d\n", *arr_p); // *arr_p 取出元素二内存地址的值 2
    
    arr_p += 2;
    
    printf("%d\n", *arr_p); // 输出4
    
    // 输出1
    
    arr_p -= 3; // 挪动指针指向到 元素一
    
    printf("%d\n", *arr_p);
    
    arr_p += 2000;
    
    printf("%d\n", *arr_p); // 系统值 572662306
    
     // 数组是连续的内存空间(没有断层,有规律) 数组  每次挪动 4个字节 == int数组 (挪动数组元素类型对应的字节数)
    
    数组大小
    sizeof arr == sizeof(arr)
    
    函数指针
    void add(int num1, int num2); // 先声明
    
    void mins(int num1, int num2) {
        printf("num1 - num2 = %d\n", (num1 - num2));
    }
    
    // 操作 回调到  add  mins
    // void(*method)(int,int)  声明好 函数指针
    // void 返回值
    // (*method) 函数名
    // (int,int) 两个参数
    void opreate(void(*method)(int,int), int num1, int num2) {
        method(num1, num2);
    
        printf("opreate函数的 method指针是多少:%p\n", method);
    }
    
    // 7.函数指针。(回调)  Java接口的回调
    int mainT8() {  // 【第一种写法】
    
        opreate(add,  10, 10);
        opreate(mins,  100, 10);
    
        // 原理是什么?
    
        printf("main函数的 add指针是多少:%p\n", add);
        printf("main函数的 mins指针是多少:%p\n", mins);
    
        // &add和add是一样的值吗
        printf("%p, %p\n", add, &add); //  004018CE, 004018CE  一样的
    
        return 0;
    }
    
    // 再实现 使用
    void add(int num1, int num2) {
        printf("num1 + num2 = %d\n", (num1 + num2));
    }
    
    函数指针2
    
    void callBackMethod(char * fileName, int current, int total) {
        printf("%s图片压缩的进度是:%d/%d\n", fileName, current, total);
    }
    
    // 压缩的方法
    // 定义函数指针: 返回值(*名称)(int,double)
    void compress(char * fileName, void(*callBackP)(char *,int,int)) {
        callBackP(fileName, 5, 100); // 回调给外交 压缩的进度情况
    }
    
    // 函数指针2
    int main9() {
    
        // 1 如果有问题
        // VS  Clion 通过了,  Linux 可能不通过(因为这样不合规范)
        // void (* call) (char *, int ,int) = callBackMethod;
    
        // 有种temp的思路一样的感觉
        //  2 再换成这种方式 【第二种写法】
        // Linux  先定义, 再赋值
        void (* call) (char *, int ,int);
        call = &callBackMethod;
    
        void (* call2) (char *, int ,int);
        void (* call3) (char *, int ,int);
        void (* call4) (char *, int ,int);
        void (* call5) (char *, int ,int);
        call5 = &callBackMethod; // &callBackMethod 1000H  == callBackMethod 1000H
    
        compress("derry.png", call5);
    
        // 常量指针  指针常量   【函数指针】
    
        // 字符串  操作符重载 + C函数
        // char * c = "Derry" + "A";
    }
    
    
    函数指针3
    void add(int i,int j) {
        printf("i+j=%d\n", i+j);
    }
    
    void add2(int i,int j) {
        printf("2 i+j=%d\n", i+j);
    }
    
    // 函数 函数指针声明来接收函数
    void test(void(*p)(int, int)) {
        p(9, 9); // 省略*
    
        (*p)(9, 9);
        (p)(9, 9); // 省略*
    
        // (&p)(9, 9); 在源码没有看到这种写法
    
        // 思考:p 为什么也可以不用写 *   函数的上面已经声明就是 函数指针,所以可以省略*
    
    }
    
    int mainT1() {
        test(add);
        test(add2);
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:C语言-2、数组、函数

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