mylogo

退役程序员的茶室 RetiredCoder.cn

← 返回上一页

C++编程基础: 11. 指针和引用

2025-04-15 08:51:14

本系列文章是配合我发布的《C++编程基础》系列视频教程的知识点总结和补充。这一节我们来讲讲指针和引用。

当我们声明一个变量时,这个变量是存放在一个内存空间当中的,这个内存空间有着一个地址,指针就是用来存放这样的地址的。指针也是一种变量,也占内存空间,但是指向不同的数据类型的指针,它们所占的内存空间长度是一致的,因为它们都只是存放内存空间的地址。

指针的声明

首先是给出指针所指向数据的数据类型, 然后跟着一个*,再给出自定义指针的名称。

如果还没有确定这个指针指向哪里,声明赋给它空值NULL,可以避免这个指针指向随机的内存位置。

例如

int* myPointer = NULL;

如果要将这个指针指向一个变量number_A,也就是要用这个指针变量存储number_A的地址,这时需要使用地址运算符&(又叫引用运算符)

int number_A = 7; 
myPointer = &number_A;

如果要看指针myPointer所指向的内存地址里的具体数值,则需要使用间接运算符*(又称解除引用运算符)

std::cout <<"myPointer points to value:"<<*myPointer<<std::endl;

其中*myPointer是myPointer指向的值。

可以把这个值赋给另一个变量

int number_B = *myPointer;

这时number_A与number_B的值应为一致。

std::cout <<"number_A = "<<number_A<<std::endl;
std::cout <<"number_B = "<<number_B<<std::endl;

如果改变myPointer指向的内存地址中存储的数值,可以用以下表达式:

*myPointer = 10;

打印后发现number_A的值跟着也发生了变化,但number_B还是原始的值。这是由于number_B所处的内存地址与number_A不同,myPointer指向的是number_A的内存位置,myPointer的值是number_A的内存空间地址。

std::cout <<"&number_A = "<<&number_A<<std::endl;
std::cout <<"&number_B = "<<&number_B<<std::endl;
std::cout <<"myPointer = "<<myPointer<<std::endl;

const用于指针

当声明时const和指针遭遇的话,const所处的位置不同,其作用也不相同。

1.指针存储的地址是常量,指针指向的数值可以变,但不能指向另一个内存空间。

int number_C = 12;
int* const pointer = &number_C;
pointer = &number_B;   //错误

2.指针指向的数值是常量,指针可指向其他内存空间, 但不能通过指针去改变它指向的数值。

int number_C = 12;
const int* pointer = &number_C;
*pointer = 14;    //错误

3.指针存储的地址和指针指向的数值都是常量

int number_C = 12;
const int* const pointer= &number_C;

使用new动态分配内存

可以通过new动态分配内存,但要记得用delete释放被分配到内存。

int* pointer = new int;
int counter = 5;
int* pointerArray = new int[counter];
delete pointer;
delete[] pointerArray;

用+/-/++/–移动指针

当指针指向了一个数组时,可以用加减操作移动指针来获得数组中各项的数值,但要注意避免指针指向的地址若超出了数组的范围可能会带来的异常。

int numbers[3]={4,9,25};
int* pointToArr =numbers;
std::cout <<"*pointToArr = "<<*pointToArr<<std::endl;
for(int i=0;i<3;i++){
    std::cout <<"*pointToArr = "<<*(pointToArr++)<<std::endl;
}

函数中指针作为参数传递

指针变量也可以作为参数传递给函数。

函数的定义:

int total(int *a, int *b){
    return *a+*b;
}

函数的调用:

int numOne = 9;
int numTwo = 6;
std::cout <<"numOne+numTwo = "<<total(&numOne,&numTwo)<<std::endl;

引用的声明

用引用为变量声明一个别名

int& ref_number_A =number_A;
int& ref_number_B =number_B;

函数中引用作为参数传递

在函数的参数中使用引用传递,可以减少由于传递参数而复制变量对内存产生的额外开销,而且比使用指针传递简单,避免了传递空指针或无效指针的风险。

函数的定义:

void total(int a, int b,int& mySum){
    mySum=a+b;
}

函数的调用:

int sum =0;total(2,9,sum);
std::cout <<"sum = "<<sum<<std::endl;

const用于引用

当const用于引用,不能通过引用改变它指向的变量值。

int number_C = 12;
const int& ref_number_C = number_C;
ref_number_C=50;   //错误