复杂的指针

要理解指针, 尤其是和一些其他类型修饰符放在一起的指针, 看上去很难,其实不然。

一个类型声明里会出现很多修饰符,他们就像普通的表达式一样,有优先级和结合性。只要掌握了这些规律,

分析一个复杂的指针类型就很容易了。

 

分析时, 先从变量名开始,然后根据修饰符的优先级结合性,一步一步分析。

下面看几个最常用的例子:

 

int p;  // 普通的int变量

 

int *p; // 首先从p开始, p先与*结合,表明p是一个指针。然后再与int结合, 表明p指向的是int类型。所以p是一个指向int类型的指针。

一般的,我们称之为整型指针。

 

int  p[3] : p先与[]结合,表明p是一个数组。然后与int结合,表明数组的元素是int类型的。因此p是一个整型的数组。

 

int *p[3]: []的优先级比*高,所以p先与[]结合,表明p是一个数组,再与*结合,表明数组里的元素是指针。再与int结合,表明指针指向的是int。所以p是一个数组,数组元素是整型指针(int*). 很多书里说数组就是指针,这是不确切的。数组和指针是两个不同的类型。切记!

 

int (*p)[3] : 这里的括号,让p与*先结合。表明p是一个指针。然后再与[]结合,表明指针指向的类型是数组。再与int结合,表明数组的元素是int类型的。 所以p是一个指向整型数组的指针。

 

在这里,int *[]和int (*)[]是两个不同的类型。

 

int **p; p为典型的二级指针。

 

int p(int): p首先与()结合,表明p是一个函数。进入()分析,说明该函数有一个int类型的参数。再与外面的int结合,表明函数的返回值是一个int。 所以p是一个参数类型为int,返回值为int的函数。

 

int (*p)(int) : 从p处开始,先与指针结合,表明p是一个指针。然后再与()结合,表明该指针指向的是一个函数。然后再与()里的int结合,表明函数有一个int类型的参数。再与最外层的int结合,表明函数的返回值是int。 这里的p是一个典型的函数指针。

 

int *(*p(int))[3] : 这个看上去很复杂。从p开始,先与()结合,表明p是一个函数,然后进入(),与int结合,表明函数的参数为int。

                            再与外面的*结合,表明函数的返回值类型是指针。然后再到最外面一层,先与[]结合,表明返回指针指向的是一个数                               组。再与最外面的*结合,表明数组的元素是指针,再与最后的int结合,表明数组的元素指针指向的是int类型。

                            所以p是一个函数, 参数为int, 返回值为指向int* []的指针。

 

这确实很复杂,同样的,对于编译器的设计来说,更为复杂。但是这也是c为什么长盛不衰的原因了。因为c的设计真的很精妙。发明

c语言的是个天才。我只能这样说。

 

 

 

 

 

 

### 复杂指针的概念及其用途 在C++中,复杂指针通常指的是多级间接指针或多维数组中的指针。这些指针可以用于动态分配内存、实现数据结构(如链表、树等),以及处理复杂的函数参数传递场景。 #### 动态内存管理 通过使用复杂指针,程序可以在运行时灵活地分配和释放内存资源。例如,在创建二维数组时,可以通过指向指针指针来完成这一操作[^1]: ```cpp int **create2DArray(int rows, int cols) { int **array = new int*[rows]; for (int i = 0; i < rows; ++i) { array[i] = new int[cols]{}; } return array; } ``` 上述代码展示了如何利用双重指针`int**`来动态分配一个二维整型数组。需要注意的是,当不再需要该数组时,应显式释放其占用的内存以防止泄漏。 #### 函数回调机制 复杂指针还常被用来定义函数指针,从而支持更高级别的抽象编程模式。下面是一个简单的例子,演示了如何声明并调用一个接受两个整数作为输入参数且返回值也为整数类型的函数指针[^2]: ```cpp typedef int (*BinaryOperation)(int, int); int add(int a, int b) { return a + b; } void performOperation(BinaryOperation op, int x, int y){ std::cout << "Result: " << op(x,y) << "\n"; } // 使用方式如下: performOperation(add, 5, 7); ``` 这里定义了一个名为`BinaryOperation`的类型别名表示一种特定形式的函数指针,并将其应用于执行加法运算的操作上。 #### 初始化规则建议 对于变量初始化方面,遵循现代C++的最佳实践尤为重要。尤其是在涉及复杂对象或者自定义类实例的时候,推荐采用统一初始化语法(uniform initialization),这有助于减少歧义并提高可读性[^3]: ```cpp std::unique_ptr<int[]> ptr(new int[10]); auto lambdaPtr = [](const auto& p){return !p.empty();}; // Lambda表达式的自动推导 ``` 以上片段分别举例说明了智能指针与lambda闭包这两种常见情况下应该如何正确运用初始化技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值