c基础—指针运算和函数指针

二级指针

//二级指针
void main(){
    int num = 12;
    int *p = #//地址 00cff7d4
    int** sp = &p;//0x00CFF7C8 对应的上一个指针 00cff7d4->12
    printf("p的值是:%p,sp的地址是:%p\n", p, sp);
    //通过二级指针获取最终的值
    printf("最终的值:%d", **sp);//*代表取值
    getchar();
}
c基础—指针运算和函数指针_第1张图片
结果分析.png

数组和数组指针

//数组和数组指针
void main(){
    //定义数组
    int arr[] = { 1, 5, 3, 4 };
    //遍历数组(这种写法linux系统会有问题)
    //for (int i = 0; i < 4; i++){
    //  printf("arr[%d]的值是:%d\n", i, arr[i]);
    //}
    ////for循环在c和c++的正确写法
    //int i = 0;
    //for (; i < 4; i++){
    //  printf("arr[%d]的值是:%d\n", i, arr[i]);
    //}


    //第一种现象:arr的值=arr地址的值=arr[0]的地址
    /*printf("arr=%p\n", arr);
    printf("arr&=%p\n", &arr);
    printf("arr[0]&=%p", &arr[0]);*/
    //获取数组的地址(指针)
    int *arr_p = arr;//数组指向的是数组的首地址

    //做一系列操作
    printf("%d\n", *arr_p);//取值,也就是是arr[0]

    //对指针进行+-
    arr_p++;
    printf("%d\n", *arr_p);//此时实际是arr[1]的数据
    //对指针往后移动2位
    arr_p += 2;
    printf("%d\n", *arr_p);

    getchar();
}

采用指针遍历数组循环赋值

遍历

//采用指针遍历数组循环赋值
void main(){

    int arr[] = { 1, 2, 3, 4 };
    int *arr_p = arr;
    int i = 0;
    for (; i < 4; i++){
        printf("位置%d的值是:%d\n", i, *(arr_p+i));
    }

    getchar();
}

赋值

void main(){

    int arr[4] ;//指定数组的长度是4
    int *arr_p = arr;
    int i = 0;
    for (; i < 4; i++){
        *(arr_p + i) = i;
        printf("位置%d的值是:%d\n", i, );
    }
    for (; i < 4; i++){
        printf("位置%d的值是:%d\n", i, arr[i]);
    }
    getchar();
}

指针与数组的几种写法

void main(){
    //定义数组
    int arr[] = { 1, 5, 3, 4 };
    int *arr_p = arr;
    int i = 0;
    for (; i < 4; i++){
    //printf("位置%d的值是:%d\n", i, *(arr+i));//arr默认是arr[0]
    printf("位置%d的值是:%d\n", i, arr_p[i]);//==*(arr_p+i)

}

函数指针(回调)

//函数指针(回调)
void add(int num1, int num2){
    printf("num1+num2=%d\n", (num1 + num2));
}
void min(int num1, int num2){
    printf("num1-num2=%d\n", (num1 - num2));
}
//方法指针
void opereate(void (method)(int, int), int num1, int num2){
    method(num1, num2);
}
void main(){
    //add(1, 2);
    //方法指针怎么定义?方法的返回*(方法的名称)(方法的参数)
    //void*(add_p)(int, int);
    opereate(add, 1, 2);
    opereate(min, 1, 2);
    getchar();
}

题目:监听数据压缩回掉

void callback(int current, int total){
    printf("压缩的进度是%d/%d\n", current, total);
}
void compress(char*file_name, void (callback)(int, int)){
    callback(12,24);
}
void main(){

    compress("美女.png", callback);
    void(*call)(int,int) = NULL;//声明了一个函数
    call = callback;//给函数指针赋值
    callback(1, 4);//通过函数指针间接调用
    getchar();
    
}

你可能感兴趣的:(c基础—指针运算和函数指针)