指针用法及常见形式




1. *P++   / *(p++)     先取p的值,实现*p运算,然后再使p自增1先取p的值,实现*p运算,然后再使p自增1.  若p=&a,则表达式结果a[0]的值。

2. *(++P)    先使P的值加‘1’,然后取P的值,结果为a[1]的值。

3. ++(*P)     先取P的值,在++,相当于++a[i]。

4. *(p--)  相当于a[i--],先取a[i]的值,然后再--。

5. *(++P) 相当于a[++i],先使p自加,然后取值

6.  int *P[4]   定义指针数组P,它由4个指向Int型的指针变量组成

7.int (*P)[4]   P为指向4个元素的以为数组指针变量。

8.int (*p)()    p为指向函数的指针

9. int **p   p是一个指针变量,指向一个指向整形数据的指针变量

### 关于指针常见使用方法 #### 多级指针 多级指针是指向指针指针,在 C 和 C++ 中是一种重要的概念。它允许程序通过多个层次间接访问数据[^1]。例如: ```c int value = 10; int *ptr = &value; // ptr 是指向 int 的指针 int **pptr = &ptr; // pptr 是指向指针指针 printf("Value is %d\n", **pptr); ``` 上述代码展示了如何定义并使用双层指针来访问变量 `value`。 #### 智能指针 智能指针是现代 C++ 提供的一种工具,旨在管理动态分配的对象生命周期,从而减少内存泄漏的风险[^2]。以下是三种常见的智能指针及其用途: - **`std::unique_ptr`**: 表示独占所有权的智能指针,同一时间只有一个 `unique_ptr` 可以拥有该资源。 - **`std::shared_ptr`**: 使用引用计数机制允许多个指针共享同一个对象。 - **`std::weak_ptr`**: 不增加引用计数,通常与 `shared_ptr` 配合使用以解决循环引用问题。 下面是一个简单的例子展示 `std::unique_ptr` 的用法: ```cpp #include <memory> #include <iostream> struct MyClass { void say_hello() { std::cout << "Hello!" << std::endl; } }; int main() { std::unique_ptr<MyClass> my_object = std::make_unique<MyClass>(); my_object->say_hello(); } ``` #### Void 指针 Void 指针 (`void*`) 是一种通用指针类型,能够存储任何数据类型的地址[^3]。然而,由于缺乏具体的数据类型信息,必须在使用前将其转换为目标类型。例如: ```c void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } int main() { int x = 5, y = 10; void *vp1 = &x; void *vp2 = &y; swap((int *)vp1, (int *)vp2); printf("x=%d, y=%d\n", x, y); return 0; } ``` 在此示例中,`swap` 函数接受两个整型参数并通过强制类型转换操作实现交换功能。 #### 字符串倒置 利用指针技术可以高效地完成字符串反转任务[^4]。如下所示的是一个基于双指针策略的经典算法实例: ```c #include <stdio.h> #include <string.h> void reverse_string(char *str) { if (!str || !(*str)) return; char *start = str; char *end = str + strlen(str) - 1; while(start < end){ char temp = *start; *start++ = *end; *end-- = temp; } } int main(){ char string[]="hello world"; reverse_string(string); puts(string); return 0; } ``` 此代码片段实现了原地修改输入字符串的功能,并打印翻转后的结果。 #### 其他语言中的指针模拟 虽然 Python 或 Java 等高级编程语言并不显式支持传统意义上的指针运算,但它们内部仍然依赖类似的机制传递大块数据结构或者文件句柄等内容。比如 Python 中列表切片实际上就是对底层连续区域的操作形式之一;而在 JavaScript ES6+ 版本里引入了 Proxy 对象,则提供了更灵活的方式去监控属性存取行为——这也可以看作是对原始地址空间读写的抽象表达方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值