C++指针的使用
1. 指针的定义和使用
指针是存储变量地址的变量
。定义格式如下:
类型 *指针名;
示例:
int a = 10;
int* p = &a; // p存储a的地址
std::cout << *p << std::endl; // 输出10,*p为解引用
2. 指针占据的内存空间
• 指针本身也是一个变量,存储的是地址
。
• 在32位系统
下,指针占4字节
;在64位系统
下,指针占8字节
,与指向的数据类型无关。
示例:
int* p1;
double* p2;
std::cout << sizeof(p1) << " " << sizeof(p2) << std::endl; // 通常输出4或8
3. 空指针
• 空指针(nullptr或NULL)表示指针未指向任何有效内存。
• 常用于初始化指针
,防止野指针。
示例:
int* p = nullptr;
if (p == nullptr) {std::cout << "p是空指针" << std::endl;
}
4. 野指针
• 指针未初始化或已释放内存后仍被使用,称为野指针。
• 使用野指针会导致未定义行为,需避免。
示例:
int* p; // 未初始化,p为野指针
// *p = 10; // 错误,不能解引用野指针
5. const修饰指针
• const可以修饰指针本身或指针指向的数据。
形式 | 含义 |
---|---|
const int* p | 指向常量的指针,不能通过p修改值 |
int* const p | 常量指针,p的地址不可变 |
const int* const p | 指向常量的常量指针 |
示例:
int a = 10, b = 20;
const int* p1 = &a; // *p1只读
int* const p2 = &a; // p2只指向a
const int* const p3 = &a; // 都不可变
6. 指针和数组
• 数组名
本质上是首元素的指针
。
• 可以用指针遍历数组
。
示例:
int arr[3] = {1, 2, 3};
int* p = arr;
for (int i = 0; i < 3; ++i) {std::cout << *(p + i) << " "; // 输出1 2 3
}
7. 指针和函数
• 可以用指针作为函数参数,实现“地址传递
”,允许函数修改外部变量
。
• 可以返回指针,也可以用指针数组、指向函数的指针等。
示例:
void swap(int* a, int* b) {int temp = *a;*a = *b;*b = temp;
}
int x = 1, y = 2;
swap(&x, &y); // x=2, y=1
8. 指针配合数组和函数的案例
数组求和函数:
int sum(int* arr, int size) {int total = 0;for (int i = 0; i < size; ++i) {total += *(arr + i);}return total;
}int main() {int arr[5] = {1, 2, 3, 4, 5};std::cout << sum(arr, 5) << std::endl; // 输出15return 0;
}
9. 其他注意事项
• 指针可以指向任意类型,包括自定义类型、结构体等。
• 指针运算需谨慎,避免越界和非法访问。
• C++11推荐使用nullptr
代替NULL。
总结:
• 指针是C++强大但需谨慎使用的特性,能高效操作内存和实现复杂数据结构。
• 正确初始化、使用const、避免野指针和空指针,是安全使用指针的关键。