调用我写的函数 只用一个指针变量!
时间: 2023-12-26 19:06:22 浏览: 32
好的,如果要只用一个指针变量调用你写的函数,可以这样实现:
```c
int LocatVex(AdjList *G, Data v) {
int i;
for (i = 0; i < G->vexnum; i++) {
if (G->vertex[i].data == v) {
return i;
}
}
return -1;
}
int main() {
AdjList *pG = (AdjList*)malloc(sizeof(AdjList));
/* 假设已经初始化了 pG */
Data v = 5;
int index = LocatVex(pG, v);
free(pG);
return 0;
}
```
在这个示例中,我们定义了一个指向 `AdjList` 类型的指针变量 `pG`,并且通过 `malloc` 函数为其分配了内存空间。定义变量 `v`,并赋值为 5,表示要查找值为 5 的结点在图中的位置。最后,我们调用 `LocatVex` 函数,将 `pG` 作为第一个参数,实现使用指针调用函数。函数返回值为结点的位置下标,存储在 `index` 变量中。完成操作后,我们需要使用 `free` 函数释放动态分配的内存空间,避免内存泄漏。
相关问题
如何定义一个函数指针变量
定义一个函数指针变量需要指定函数指针类型和变量名,语法如下:
```
返回类型 (*指针变量名)(参数列表)
```
其中,`返回类型` 是指函数返回值的数据类型;`指针变量名` 是指指针变量的名称;`参数列表` 是指函数的参数类型列表,多个参数之间用逗号分隔。
例如,如果有一个函数 `add`,它接收两个整数参数并返回它们的和。那么可以定义一个函数指针类型 `int (*)(int, int)`,然后用该类型定义一个函数指针变量 `funcPtr`,示例代码如下:
```c
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int main() {
int (*funcPtr)(int, int); // 定义一个函数指针变量
funcPtr = add; // 将函数的入口地址赋值给函数指针变量
int result = (*funcPtr)(2, 3); // 通过函数指针调用函数
printf("%d\n", result);
return 0;
}
```
在这个例子中,定义了一个函数 `add`,它接收两个整数参数并返回它们的和。然后,定义了一个函数指针变量 `funcPtr`,它的类型是 `int (*)(int, int)`,即指向返回值为整型、接收两个整型参数的函数的指针类型。接着,将 `add` 函数的入口地址赋值给 `funcPtr`,最后通过 `(*funcPtr)(2, 3)` 调用 `add` 函数并将结果存储在变量 `result` 中。
需要注意的是,函数指针变量可以在定义时进行初始化,也可以在后面进行赋值。但是,一定要确保函数指针变量指向的函数和函数指针类型是匹配的,否则会导致编译错误。
只用一个指针 不用变量G
好的,如果要使用指针而不用变量 `G`,可以这样实现:
```c
int LocatVex(AdjList *G, Data v) {
int i;
for (i = 0; i < G->vexnum; i++) {
if (G->vertex[i].data == v) {
return i;
}
}
return -1;
}
int main() {
AdjList G;
/* 假设已经初始化了 G */
Data v = 5;
int index = LocatVex(&G, v);
return 0;
}
```
在这个示例中,我们把 `AdjList` 类型的指针 `G` 改为函数参数 `AdjList *G`。调用 `LocatVex` 函数时,我们传入 `&G` 表示 `G` 的地址。在 `main` 函数中,我们定义了一个 `AdjList` 类型的变量 `G`,并且已经初始化完成。最后,我们调用 `LocatVex` 函数,将 `&G` 作为第一个参数,即将 `G` 的地址传入函数中,实现使用指针调用函数。函数返回值为结点的位置下标,存储在 `index` 变量中。