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