指针是c++中的一个核心概念,它存储的是内存地址,而不是实际的值。理解指针对于掌握c++编程至关重要。
1. 基本概念
指针的定义和声明
int x = 10; // 普通变量 int *ptr = &x; // 指针变量,存储x的地址
*表示声明一个指针&是取地址运算符ptr存储的是x的内存地址*ptr是解引用,获取该地址存储的值
2. 指针的基本操作
#include <iostream>
using namespace std;
int main() {
int x = 10;
int *ptr = &x; // ptr指向x
cout << "x的值: " << x << endl; // 输出: 10
cout << "x的地址: " << &x << endl; // 输出: x的地址
cout << "ptr的值: " << ptr << endl; // 输出: x的地址
cout << "*ptr的值: " << *ptr << endl; // 输出: 10
*ptr = 20; // 通过指针修改x的值
cout << "修改后x的值: " << x << endl; // 输出: 20
return 0;
}
3. 指针类型
空指针
int *ptr = nullptr; // c++11及以后推荐 int *ptr = 0; // 传统方式 int *ptr = null; // c风格,不推荐在c++中使用
悬空指针(野指针)
指向已释放内存的指针,使用会导致未定义行为:
int *ptr = new int(10); delete ptr; // ptr现在成为悬空指针,应该避免使用 ptr = nullptr; // 好习惯:释放后置为空
4. 指针运算
int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr; // 指向数组首元素
cout << *ptr << endl; // 输出: 1
cout << *(ptr + 1) << endl;// 输出: 2(指针加法)
cout << ptr[2] << endl; // 输出: 3(数组语法)
ptr++; // 移动到下一个元素
cout << *ptr << endl; // 输出: 2
5. 动态内存分配
// 分配单个变量
int *p = new int; // 分配内存
*p = 100; // 赋值
delete p; // 释放内存
p = nullptr; // 置空
// 分配数组
int *arr = new int[5]; // 分配5个int的空间
for (int i = 0; i < 5; i++) {
arr[i] = i * 10;
}
delete[] arr; // 释放数组内存
6. 多级指针
int x = 10; int *p = &x; // 一级指针 int **pp = &p; // 二级指针 int ***ppp = &pp; // 三级指针 cout << x << endl; // 10 cout << *p << endl; // 10 cout << **pp << endl; // 10 cout << ***ppp << endl; // 10
7. 指针和函数
指针作为函数参数(按地址传递)
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 5, y = 10;
swap(&x, &y); // 传递地址
cout << x << ", " << y << endl; // 输出: 10, 5
return 0;
}
返回指针的函数
int* createarray(int size) {
return new int[size]; // 返回动态数组的指针
}
// 注意:不要返回局部变量的地址
int* badfunction() {
int x = 10;
return &x; // 错误!x在函数结束后被销毁
}
8. 指针和数组
int arr[3] = {1, 2, 3};
// 数组名在多数情况下退化为指针
int *ptr = arr; // 等价于 int *ptr = &arr[0];
// 通过指针遍历数组
for (int i = 0; i < 3; i++) {
cout << *(ptr + i) << " "; // 输出: 1 2 3
}
9. const 和指针
int x = 10; int y = 20; // 指向常量的指针(不能通过指针修改值) const int *ptr1 = &x; // *ptr1 = 30; // 错误! ptr1 = &y; // 正确:可以改变指向 // 常量指针(不能改变指向) int *const ptr2 = &x; *ptr2 = 30; // 正确:可以修改值 // ptr2 = &y; // 错误! // 指向常量的常量指针 const int *const ptr3 = &x; // *ptr3 = 30; // 错误! // ptr3 = &y; // 错误!
10. 智能指针(c++11及以上)
智能指针自动管理内存,避免内存泄漏:
#include <memory> // unique_ptr:独占所有权 std::unique_ptr<int> uptr(new int(10)); // shared_ptr:共享所有权 std::shared_ptr<int> sptr1 = std::make_shared<int>(20); std::shared_ptr<int> sptr2 = sptr1; // 引用计数增加 // weak_ptr:弱引用,不增加引用计数 std::weak_ptr<int> wptr = sptr1;
到此这篇关于c++中指针变量的使用指南的文章就介绍到这了,更多相关c++ 指针变量内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论