我不明白指针在此代码中如何工作?

时间:2019-06-20 11:51:36

标签: 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);
}

1 个答案:

答案 0 :(得分:1)

请注意,函数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 ++的卖点之一是使人们比这更容易编写多态对象。