c - 我不明白指针在这段代码中是如何工作的?

标签 c pointers

我不明白下面这部分代码。我的意思是 alloc_MY_CAR() 返回一些数组,以及 & 如何工作,以便 newTab->pFunFree = &free_MY_CAR 看到这个 newTab 的数组->pDat 返回?

我不太了解指针。我只知道 & 存储变量的地址,而 * 是变量的指针或值。 谁能指导我如何正确使用它以及它是如何工作的?我是个初学者,所以不要对我那么难。

提前致谢!

#pragma once
struct MY_CAR {
    char *model;
    int year;
};


void print_MY_CAR(void* pdata);
void free_MY_CAR(void *pdata);

MY_CAR* alloc_MY_CAR();



    switch (typ) {
        case 0:
            newTab->pDat = alloc_MY_CAR();
            newTab->pFunFree = &free_MY_CAR;
            newTab->pFunPrint = &print_MY_CAR;
            break;
    }
    MY_CAR* alloc_MY_CAR() {
        MY_CAR* tab = (MY_CAR*)calloc(1, sizeof(MY_CAR));
        if (!tab) {
            exit(0);
        }
        else {
            char model[125];
            printf("Podaj model: ");
            scanf("%s", model);
            tab->model = (char*)calloc(strlen(model) + 1, sizeof(char));
            strcpy(tab->model, model);
            printf("Podaj rok: ");
            scanf_s("%d", &tab->year);
        }
        return tab;
    }
void free_MY_CAR(void *pdata) {
    MY_CAR* car = (MY_CAR*)pdata;
    if (!car || !car->model) return ;
    free(car->model);
    free(car);
}

最佳答案

请注意,函数 free_MY_CAR 有一个 void* 类型的参数, 指向“void”类型的指针 (这是一个 C 习惯用法,表示指向某个事物的指针,但不告诉所指向事物的类型), 它所做的第一件事就是将该指针重新解释为指向 MY_CAR 的指针。

所以该函数可能应该这样调用:

newTab->pFunFree(newTab->pDat);

也就是说,函数“知道”返回什么指针的方式 alloc_MY_CAR() 并存储在 newTab->pDat 中 是程序员明确告诉函数什么是指针 存储在 newTab->pDat 中。

这样做的好处是,它允许某些代码对数据结构进行某些操作,而不必知道程序实际运行时它将实际操作哪种数据结构。 在上面对 pFunFree 的调用中,newTab 可能已由问题中显示的 case 0 代码初始化,但可能还有另一种情况 使用 alloc_MY_JOB()&free_MY_JOB&print_MY_JOB 对其进行初始化, 其中 MY_JOB 函数分配/释放/打印一个与使用的数据结构完全不同的数据结构 alloc_MY_CAR()&free_MY_CAR&print_MY_CAR。 然后如果你打电话

newTab->pFunPrint(newTab->pDat);

我们可能无法预测当我们编写代码时它是否会打印由以下内容创建的数据结构的内容 alloc_MY_CAR() 或通过 alloc_MY_JOB(); 但我们可以预测它将打印它所拥有的详细信息 关于您的汽车、工作或从数据文件中读取并存储在 newTab 中的任何信息。

我们可以进行函数调用,以适合该数据结构的方式使用该数据结构,而无需知道我们在编写代码时数据结构的类型是什么,该属性称为 多态性

这是一个麻烦的习语,并且有很多方法会出错。 C++ 的卖点之一是使人们能够比这更容易地编写多态对象。

关于c - 我不明白指针在这段代码中是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56685373/

相关文章:

c - 将可变参数列表转发到 c 中的 ncurses printw 函数

c - typedef 结构清晰度

c++ - 如何使用字符串(字符数组)初始化 char 指针而不是整数数组的 int 指针?

c++ - 神秘构建错误 "symbol(s) not found for i386"- openFrameworks 像素操作

c++ - 将复杂对象传递给 C++ 中的函数,但数组订阅运算符无法正常工作

c - realloc 和 calloc 的动态内存分配问题

c - 使用 Shell 脚本将数据发送到正在运行的进程

c - 在 C 中的 OpenAL 中播放频率

c - 套接字:如何使用 inet_pton() 屏蔽二进制形式的 ip 地址

c++ - 函数之间的数组指针丢失值(用 swig 编译以在 python3 中使用)