关于指针类型的写法

第一种:基本数据类型和类型修饰符放一起,与变量名用空格隔开

int* a;

这种写法在下面情况时会让初学者产生误解:

int* a,b;//会让人误以为int* 同时作用于a和b

实际上基本数据类型是 int 而不是 int* ,类型修饰符(*,&)仅仅修饰了变量名而已,对一条语句中的其他变量名 b 不产生任何作用

第二种写法:修饰符和变量名在一起

int *a;

这种情况下会产生另一种误解:变量名是*a。实际上变量名只是 a, *不过是修饰符而已。

总结:
以上两种写法都正确,应当选择并坚持一种写法,最好一条语句只定义一个变量。

### C/C++ 中函数指针的定义与使用 #### 定义 在 C 和 C++ 编程语言中,函数指针是一种特殊的指针类型,用于存储函数的入口地址。通过函数指针可以间接调用对应的函数[^1]。 函数指针的声明方式遵循以下语法结构: ```c 返回类型 (*指针变量名)(参数列表); ``` 例如,如果有一个返回 `int` 类型并接受两个 `int` 参数的函数,则其对应函数指针的声明如下所示: ```c int (*func_ptr)(int, int); ``` 此语句表示 `func_ptr` 是一个指向具有 `(int, int)` 参数列表且返回值为 `int` 的函数的指针[^3]。 --- #### 使用方法 ##### 1. 基本赋值与调用 要使函数指针能够正常工作,首先需要将其初始化为某一具体函数的地址。可以通过两种方式进行赋值: - **隐式赋值**:直接将函数名称赋予函数指针。 - **显式赋值**:使用取址运算符 (`&`) 获取函数地址后再赋值给函数指针。 下面是一个简单的例子展示如何定义、初始化以及调用函数指针: ```c #include <stdio.h> // 定义目标函数 int add(int a, int b) { return a + b; } int main() { // 声明函数指针 int (*func_ptr)(int, int); // 将函数 'add' 地址赋值给 func_ptr func_ptr = add; // 或者采用显式的方式 // func_ptr = &add; // 调用函数指针所指向的函数 printf("Result: %d\n", (*func_ptr)(5, 3)); // 输出 Result: 8 } ``` 注意,在实际应用中通常省略解引用操作符 `(*)` 来简化书写形式,即可以直接写作 `func_ptr(5, 3)`[^2]。 --- ##### 2. 函数指针作为函数参数 函数指针还可以作为另一个函数的形式参数传入其中,从而实现回调机制等功能。以下是演示该特性的代码片段: ```c #include <stdio.h> #include <stdlib.h> // 不同类型的处理函数 double square(double num) { return num * num; } double cube(double num) { return num * num * num; } // 接收函数指针作为参数的通用计算函数 void compute(double numbers[], size_t count, double(*operation)(double)) { for (size_t i = 0; i < count; ++i) { numbers[i] = operation(numbers[i]); } } int main() { double data[] = {1.0, 2.0, 3.0}; size_t length = sizeof(data)/sizeof(data[0]); // 对数据执行平方运算 compute(data, length, square); for (size_t i = 0; i < length; ++i) { printf("%.2lf ", data[i]); // 输出 1.00 4.00 9.00 } putchar('\n'); // 对相同的数据重新执行立方运算 compute(data, length, cube); for (size_t i = 0; i < length; ++i) { printf("%.2lf ", data[i]); // 输出 1.00 64.00 729.00 } putchar('\n'); } ``` 在此案例中,`compute()` 函数接收了一个名为 `operation` 的函数指针作为输入之一,并依据不同的逻辑动态调整行为模式[^1]。 --- ##### 3. 返回函数指针 除了充当参数外,函数也支持返回其他函数的指针来构建更复杂的程序架构。比如下面这段代码展示了如何设计这样一个接口: ```c #include <stdio.h> // 多种可能的选择项 float multiply(float x, float y) { return x * y; } float divide(float x, float y) { return y != 0 ? x / y : INFINITY; } // 工厂函数负责生产合适的算术处理器 float (*get_operator(char op))(float, float) { switch(op){ case '*': return multiply; case '/': return divide; default: return NULL; } } int main(){ char operator_ch = '/'; float operand_a = 10.f ,operand_b = 2.f ; float(*op_func)(float,float)= get_operator(operator_ch); if(!op_func){ puts("Unsupported Operation!"); }else{ printf("The result is %.2f.\n", op_func(operand_a, operand_b)); } } ``` 此处的关键在于理解工厂函数 `get_operator()` 如何根据外部条件决定最终应该提供哪一种具体的算法实例[^4]。 --- ##### 4. 成员函数指针 对于面向对象编程环境下的情况来说,由于类内部的方法本质上属于特定的对象实体而非全局共享资源,因此普通的自由函数指针无法满足需求。此时就需要引入成员函数指针的概念。它们的工作原理较为复杂一些,因为每次访问都需要额外绑定到某个有效的实例上去完成动作[^5]。 举个简单的小例子说明这一点吧: ```cpp class Counter { public: void increment() const { std::cout << "Incremented!" << '\n'; } }; using MemFnPtrType = void (Counter::*)() const; MemFnPtrType ptrToMemberFunc = &Counter::increment; Counter objInstance; (objInstance.*ptrToMemberFunc)(); ``` 以上便是关于 C/C++ 下函数指针基本概念及其主要应用场景的一个概括介绍。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值