我不理解下面这部分代码。我的意思是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/

10-12 20:42