我不理解下面这段代码的内容。我的意思是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);
}
答案 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 ++的卖点之一是使人们比这更容易编写多态对象。