C++指针

1.什么是指针?

指针是一个变量,其值为另一个变量的地址。换句话说,它“指向”内存中的一个位置。这使得你可以间接访问或修改这个位置的值。与引用不同(引用即别名),指针本身也是一个对象,允许对指针进行赋值与拷贝,而且在指针的生命周期内它可以先后指向几个不同的对象

2.声明指针

指针变量的声明与普通变量相似,但它前面带有一个星号(‘*’);

int *p;

3.初始化指针

指针可以初始化为某个变量的地址:

int i = 3;
int *p = &i;//'&'为取地址符,p指向i的地址,也就是i在内存中的位置。

4.使用指针

  • 访问指针自身的值(一个地址):直接使用指针名。
  • 访问指针指向的值:使用‘*’运算符。解引用操作符。
cout << p;   //输出i的地址
cout << *p;  //输出i的值,即3

5.指针的运算

你可以对指针进行某些算术运算,如递增、递减、加或减一个整数。这常用于数组和动态内存。

6. nullptr

在 C++11 之后,为了表示空指针,建议使用 nullptr 而不是 NULL。

int *p = nullptr;

7.指针与数组

数组和指针之间有一个紧密的关系。数组名实际上是一个指向其第一个元素的指针。

int arr[5] = {1, 2, 3, 4, 5};
int *p = arr;  // p 指向 arr[0]

8.指针与动态内存

使用 new 和 delete 运算符,你可以动态地分配和释放内存。

int *p = new int;      // 动态分配一个整数
*p = 10;
delete p;              // 释放内存

9.指针与函数

可以将指针作为函数参数,这允许你在函数内修改外部变量的值。

10.指向指针的指针

可以有指针指向另一个指针:

int x = 10;
int *p = &x;
int **pp = &p;  // pp 是一个指向 int* 的指针

11.注意事项

总是确保指针指向已分配的内存或 nullptr。
避免野指针(没有初始化的指针)。
使用完动态内存后,务必释放它。

结论:

指针是 C++ 中非常强大的一个特性,但也容易引发错误,如内存泄漏、段错误等。因此,使用指针时必须小心。随着 C++ 的发展,我们现在更推荐使用智能指针(如 std::shared_ptr 和 std::unique_ptr)来管理动态内存,因为它们更安全。

Q1. 指针p的定义如下,p的值是多少?

char a = 'a';
char *p = &a;
cout << p; //输出p指向的地址,一个整数值
cout << *p; //输出p指向的地址上保存的值,即’a‘
int a = 1;
int *p = &a;
cout << p; //输出p指向的地址,一个整数值
cout << *p;//输出p指向的地址上保存的值,即1

Q2. 指针是指向一个对象的地址,其值为该地址值,不同类型的指针获取的值都是一个整数(地址),那么不同类型的指针能否相互赋值?

在C++中,不同类型的指针之间的赋值是不允许的,因为这会破坏类型安全。但是,你可以使用类型转换来显式地在不同类型的指针之间进行转换。

举个例子:

int i = 42;
int* int_ptr = &i;
double* dbl_ptr;

// 下面这行代码会导致编译错误,因为你不能直接将 int* 赋值给 double*。
// dbl_ptr = int_ptr;

// 但你可以使用显式类型转换来完成这种赋值:
dbl_ptr = reinterpret_cast<double*>(int_ptr);

reinterpret_cast 允许你进行低级的、bit-for-bit的转换。但使用它是很危险的,因为它基本上绕过了C++的类型系统。在上述例子中,虽然你将 int* 转换为了 double*,但解引用 dbl_ptr 是未定义的行为,因为其实际指向的对象并不是 double 类型。

为了类型安全和代码清晰性,一般来说,除非有充分的理由,否则应避免在不同类型的指针之间进行这种转换。

总之,C++的类型系统是为了提供类型安全和防止误操作而设计的。指针的类型信息帮助编译器捕获潜在的错误,从而避免程序运行时出现问题。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值