指针函数调用的案例代码
时间: 2023-07-09 15:39:53 浏览: 48
下面是一个指针函数调用的案例代码:
```c
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int (*operation)(int, int);
int main() {
operation = add;
int result = operation(2, 3);
printf("The result is: %d\n", result);
return 0;
}
```
在这个例子中,我们定义了一个名为 `add` 的函数,它接受两个整数参数并返回它们的和。然后,我们定义了一个名为 `operation` 的指向函数的指针,该指针指向 `add` 函数。最后,我们在 `main` 函数中使用指针调用 `add` 函数,并将结果存储在 `result` 变量中,最后输出结果。
需要注意的是,在指针函数调用中,我们使用指针变量名称后面跟着参数列表来调用函数,就像在调用普通函数时一样。
相关问题
C++多态案例详细代码及讲解
多态是C++中面向对象编程的重要特性之一,它可以让我们在编写程序时更加灵活和易于扩展。下面我们来看一个简单的多态案例。
假设我们有一个动物类(Animal),其中有一个虚函数makeSound(),用于输出动物的叫声。然后我们派生出几个动物子类(如狗Dog、猫Cat等),它们都重写了makeSound()函数输出自己的叫声。最后我们编写一个测试程序,用于创建不同的动物对象,并调用它们的makeSound()函数输出叫声。
下面是详细的代码及讲解:
```cpp
#include <iostream>
using namespace std;
// 动物类
class Animal {
public:
virtual void makeSound() {
cout << "动物叫声..." << endl;
}
};
// 狗类
class Dog : public Animal {
public:
virtual void makeSound() {
cout << "汪汪汪..." << endl;
}
};
// 猫类
class Cat : public Animal {
public:
virtual void makeSound() {
cout << "喵喵喵..." << endl;
}
};
// 测试函数
void test(Animal* animal) {
animal->makeSound();
}
// 主函数
int main() {
Animal* animal1 = new Animal();
Animal* animal2 = new Dog();
Animal* animal3 = new Cat();
test(animal1);
test(animal2);
test(animal3);
delete animal1;
delete animal2;
delete animal3;
return 0;
}
```
上述代码中,Animal类是一个基类,我们将makeSound()函数声明为虚函数,表示它可以被子类重写。Dog和Cat类分别继承自Animal类,并重写了makeSound()函数,输出不同的叫声。
在测试函数test()中,我们将传入的动物指针参数强制转换为Animal类型,然后调用它们的makeSound()函数。这里需要注意的是,我们将动物指针参数声明为Animal*类型而不是Dog*或Cat*类型,这是因为在多态中,我们通常使用基类指针或引用来指向派生类对象,这样可以让我们更加灵活地操作对象。
在主函数中,我们创建了三个动物对象,分别为基类对象、狗类对象和猫类对象,并将它们作为参数传递给test()函数进行测试。由于makeSound()函数被声明为虚函数,因此在调用test()函数时会根据传入的实际对象类型来动态调用对应的函数,这就是多态的体现。
最后需要注意的是,在程序结束时我们需要释放动态分配的内存,以免出现内存泄漏。
帮我输出一份关于c语言的快慢指针的经验案例教程
当我们在编写 C 语言程序时,经常会用到指针,而快慢指针(双指针)则是其中比较常见的一种。在下面的实例中,我将演示如何使用快慢指针来解决 LeetCode 上的一道题目。
题目描述:给定一个链表,判断它是否有环。
常规方法是使用哈希表或者标记法,但是我们也可以使用快慢指针来解决这个问题。具体实现如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// 链表结构体
struct ListNode {
int val;
struct ListNode *next;
};
// 创建链表
struct ListNode* createList(int a[], int n) {
struct ListNode *head, *p, *q;
head = (struct ListNode*)malloc(sizeof(struct ListNode));
head->val = a[0];
head->next = NULL;
p = head;
for (int i = 1; i < n; i++) {
q = (struct ListNode*)malloc(sizeof(struct ListNode));
q->val = a[i];
q->next = NULL;
p->next = q;
p = q;
}
return head;
}
// 判断链表是否有环
bool hasCycle(struct ListNode *head) {
if (head == NULL || head->next == NULL) {
return false;
}
struct ListNode *fast = head->next;
struct ListNode *slow = head;
while (fast != slow) {
if (fast == NULL || fast->next == NULL) {
return false;
}
fast = fast->next->next;
slow = slow->next;
}
return true;
}
int main() {
int a[] = {3,2,0,-4};
int n = sizeof(a) / sizeof(int);
struct ListNode *head = createList(a, n);
// 使链表有环
head->next->next->next->next = head->next;
if (hasCycle(head)) {
printf("链表有环\n");
} else {
printf("链表没有环\n");
}
return 0;
}
```
在上面的代码中,我们首先定义了一个链表结构体 `struct ListNode`,然后通过 `createList` 函数创建了一个链表。接下来,我们定义了 `hasCycle` 函数来判断链表是否有环。在函数中,我们定义了两个指针,一个指针 `fast` 每次移动两个节点,另一个指针 `slow` 每次移动一个节点。如果链表有环,则 `fast` 指针最终会追上 `slow` 指针,否则 `fast` 指针会到达链表的末尾。
最后,我们在 `main` 函数中调用 `hasCycle` 函数来判断链表是否有环,并输出结果。
总结:快慢指针是一种比较常见的指针应用方法,可以用来解决多种问题,比如判断链表是否有环。