基本概念
- 指针:一个变量,它存储另一个变量的内存地址。
- 地址运算符
&
:用于获取变量的内存地址。 - 间接运算符
*
:用于访问指针所指向的变量的值。
声明和初始化
int a = 10; // 定义一个整数变量
int *p = &a; // 定义一个指向整数的指针,并将其初始化为a的地址
操作指针
获取变量地址
int a = 10;
int *p = &a; // 获取变量a的地址,并赋值给指针p
访问指针指向的值
int a = 10;
int *p = &a;
std::cout << *p << std::endl; // 输出10
修改指针指向的值
int a = 10;
int *p = &a;
*p = 20; // 修改指针p指向的变量a的值
std::cout << a << std::endl; // 输出20
常见用法
动态内存分配
使用new
和delete
关键字进行动态内存分配和释放:
int *p = new int; // 动态分配一个整数
*p = 10; // 给分配的内存赋值
std::cout << *p << std::endl; // 输出10
delete p; // 释放分配的内存
分配数组并释放:
int *arr = new int[5]; // 动态分配一个整数数组
for (int i = 0; i < 5; ++i) {arr[i] = i; // 给数组赋值
}
for (int i = 0; i < 5; ++i) {std::cout << arr[i] << " "; // 输出数组内容
}
delete[] arr; // 释放数组内存
指针数组和指向数组的指针
指针数组:
int a = 10, b = 20, c = 30;
int *arr[3] = {&a, &b, &c}; // 定义一个指针数组
std::cout << *arr[0] << " " << *arr[1] << " " << *arr[2] << std::endl; // 输出10 20 30
指向数组的指针:
int arr[3] = {10, 20, 30};
int (*p)[3] = &arr; // 定义一个指向数组的指针
std::cout << (*p)[0] << " " << (*p)[1] << " " << (*p)[2] << std::endl; // 输出10 20 30
指针函数和函数指针
指针函数:返回指针的函数
int* func() {int *p = new int(10); // 动态分配一个整数并初始化为10return p;
}
int *p = func();
std::cout << *p << std::endl; // 输出10
delete p;
函数指针:指向函数的指针。
int add(int a, int b) {return a + b;
}
int (*p)(int, int) = add; // 定义一个指向函数add的指针
std::cout << p(2, 3) << std::endl; // 输出5
代码示例
以下是一个更完整的例子,展示了指针的各种用法
#include <iostream>int main() {// 声明和初始化指针int a = 10;int *p = &a;std::cout << "Value of a: " << a << std::endl; // 输出a的值std::cout << "Address of a: " << &a << std::endl; // 输出a的地址std::cout << "Pointer p points to: " << p << std::endl; // 输出指针p的值(即a的地址)std::cout << "Value pointed to by p: " << *p << std::endl; // 输出指针p指向的值// 修改指针指向的值*p = 20;std::cout << "New value of a: " << a << std::endl; // 输出a的新值// 动态内存分配和释放int *dynamicInt = new int(30);std::cout << "Dynamically allocated integer: " << *dynamicInt << std::endl;delete dynamicInt;// 动态数组分配和释放int *dynamicArray = new int[5];for (int i = 0; i < 5; ++i) {dynamicArray[i] = i * 10;}for (int i = 0; i < 5; ++i) {std::cout << "dynamicArray[" << i << "]: " << dynamicArray[i] << std::endl;}delete[] dynamicArray;// 指针数组int x = 1, y = 2, z = 3;int *ptrArray[3] = {&x, &y, &z};for (int i = 0; i < 3; ++i) {std::cout << "Value pointed to by ptrArray[" << i << "]: " << *ptrArray[i] << std::endl;}// 指向数组的指针int arr[3] = {100, 200, 300};int (*arrPtr)[3] = &arr;std::cout << "Values in array through pointer: " << (*arrPtr)[0] << ", " << (*arrPtr)[1] << ", " << (*arrPtr)[2] << std::endl;// 函数指针int (*funcPtr)(int, int) = [](int a, int b) -> int { return a + b; };std::cout << "Sum using function pointer: " << funcPtr(5, 7) << std::endl;return 0;
}
结论
通过上述示例,可以看到指针在C++中是如何声明、初始化和操作的。指针的灵活性使其在动态内存分配、数组处理、指针数组、指向数组的指针以及函数指针等方面得到了广泛应用。在使用指针时,需要特别注意内存管理和避免悬空指针的出现,以保证程序的稳定性和安全性。