繁体   English   中英

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

[英]I don't understand how pointers work in this code?

我不明白下面这部分代码。 我的意思是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函数分配/释放/打印一种&free_MY_CAR alloc_MY_CAR()&free_MY_CAR&print_MY_CAR使用的数据结构完全不同的数据结构。 那么如果你打电话

newTab->pFunPrint(newTab->pDat);

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

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

这是一个繁琐的习语,有很多方法可以弄错。 C++ 的卖点之一是使人们能够比这更容易地编写多态对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM