Skip to content

C++ 指针

c++基本知识

*==声明==时,表示==指针变量==数据类型 * 变量名 = 内存地址*==使用==时,表示取指针变量内存区域存储的==数值== &==使用==时,==取==变量的==内存地址==

&p指针变量自身地址 *p指针指向的内存中存储的值 p指针保存的内存地址

cpp
value_type * value_name = &adress_num
cpp
int *p = new int;
*p = 10;

cout << "指针地址(&p)为:" << &p << endl;  // 输出指针变量自身的地址
cout << "指针(*p)为:" << *p << endl;       // 输出指针指向的内存中存储的值
cout << "指针(p)为:" << p << endl;        // 输出指针保存的内存地址

p++;  // 将指针向前移动一个 int 的大小(通常是4或8字节)
cout << "指针(p++)为:" << p << endl;        // 输出操作后的内存地址
cout << "指针(&p++)为:" << &p << endl;      // 误用,&p 的值并未改变,输出的仍然是指针变量自身的地址
cout << "指针(*p++)为:" << *p << endl;      // 输出新地址处的未定义值(此处是未定义行为)

C++ 指针详解

在 C++ 中,有很多指针相关的概念,这些概念都很简单,但是都很重要。下面列出了 C++ 程序员必须清楚的一些与指针相关的重要概念:

概念描述
C++ Null 指针C++ 支持空指针。NULL 指针是一个定义在标准库中的值为零的常量。
C++ 指针的算术运算可以对指针进行四种算术运算:++、--、+、-
C++ 指针 vs 数组指针和数组之间有着密切的关系。
C++ 指针数组可以定义用来存储指针的数组。
C++ 指向指针的指针C++ 允许指向指针的指针。
C++ 传递指针给函数通过引用或地址传递参数,使传递的参数在调用函数中被改变。
C++ 从函数返回指针C++ 允许函数返回指针到局部变量、静态变量和动态内存分配。

野指针和空指针

野指针

cpp
int * p; //声明指针(分配8字节空间),未赋值指向未知空间 
*p = 10; //将10存储在未知空间

空指针

==避免野指针的安全问题==

cpp
int * p = NULL; //声明空指针(或者nullptr),指向
*p = 10; //指向10所在的位置

指针运算

加法运算

可以对指针进行加法运算。当一个指针p加上一个整数n时,结果是指针p向前移动n个元素的大小。例如,如果p是一个int类型的指针,每个int占4个字节,那么p + 1将指向p所指向的下一个int元素。

cpp
int num = 10;
int *p = #

cout << p << endl;    //结果:0x20d1ff6e4
p++;
cout << p << endl;    //结果:0x20d1ff6e8

减法运算:

可以对指针进行减法运算。当一个指针p减去一个整数n时,结果是指针p向后移动n个元素的大小。例如,如果p是一个int类型的指针,每个int占4个字节,那么p - 1将指向p所指向的前一个int元素。

cpp
int num = 10;
int *p = #

cout << p << endl;    //结果:0x20d1ff6e8
p--;
cout << p << endl;    //结果:0x20d1ff6e4

指针与指针之间的减法运算:

可以计算两个指针之间的距离。当从一个指针p减去另一个指针q时,结果是两个指针之间的元素个数。例如,如果p和q是两个int类型的指针,每个int占==4个字节==,那么p - q将得到两个指针之间的元素个数。

指针与整数之间的比较运算:

可以将指针与整数进行比较运算。可以使用关系运算符(如<、>、<=、>=)对指针和整数进行比较。这种比较通常用于判断指针是否指向某个有效的内存位置。

动态内存分配

new手动分配,申请并返回指针

cpp
val_type *p = new val_type;  //申请内存空间,并返回内存地址
new val_type[];

delete释放new运算符申请的内存区

cpp
delete 指针;   //根据内存地址清除
delete[] 数组的指针

常量指针和指针常量

1.常量指针(Constant Pointer)->不能改数据

常量指针是指指向常量的指针。这意味着==指针指向的数据不能通过这个指针被修改(即所指向的值是常量)==,但是指针本身的指向可以改变,即你可以使它指向另一个地址。常量指针通常用于保证函数内部不会改变输入数据。

语法

cpp
const 数据类型名* 指针名;

示例

cpp
const int* ptr;
int value = 10;
int value2 = 20;
ptr = &value;   // 可以指向value
// *ptr = 15;   // 错误:不能通过ptr修改value,因为ptr是指向const int的
ptr = &value2;  // 可以改变ptr的指向

2.指针常量(Pointer to Constant)->不能改指向

指针常量是指指针自身是常量。这意味着==一旦指针被初始化后,你不能再改变它的指向(即指针的地址是常量)==,但是你可以通过这个指针修改它所指向地址的数据(除非该数据本身被定义为常量)。

语法

cpp
数据类型名* const 指针名;

示例

cpp
int value = 10;
int value2 = 20;
int* const ptr = &value; // ptr 必须在声明时初始化
*ptr = 15;               // 正确:ptr指向的值可以改变
// ptr = &value2;       // 错误:不能改变ptr的指向,因为ptr是const

3. 常量指针常量 (Constant Pointer to Constant)

有时候,你可能还会遇到指针本身和它所指向的数据都是常量的情况。这种类型的指针既不能改变指向也不能通过指针修改数据。

语法

cpp
const 数据类型名* const 指针名

示例

cpp
int value = 10;
const int* const ptr = &value; // ptr 必须在声明时初始化,且不可通过ptr修改value,也不能改变ptr的指向
// *ptr = 20;                  // 错误:不能修改value
// ptr = &value2;              // 错误:不能改变ptr的指向

评论区

欢迎留言、补充或勘误。

xiaoba.blog