news 2026/4/30 9:01:29

深入解读C++中的指针变量

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深入解读C++中的指针变量

针变量是一种特殊的变量,它和以前学过的其他类型的变量的不同之处是:用它来指向另一个变量。为了表示指针变量和它所指向的变量之间的联系,在C++中用“*”符号表示指向,例如,i_pointer是一个指针变量,而*i_pointer表示i_pointer所指向的变量。

下面两个语句作用相同:

1

2

i=3;

*i_pointer=3;


定义指针变量

C++规定所有变量在使用前必须先定义,即指定其类型。在编译时按变量类型分配存储空间。对指针变量必须将它定义为指针类型。先看一个具体例子:

1

2

inti, j;//定义整型变量i,j

int*pointer_1, *pointer_2;//定义指针变量*pointer_1,*pointer_2


第2行开头的int是指:所定义的指针变量是指向整型数据的指针变量。也就是说,指针变量pointer_1和pointer_2只能用来指向整型数据(例如i和j),而不能指向浮点型变量a和b。这个int就是指针变量的基类型。指针变量的基类型用来指定该指针变量可以指向的变量的类型。

定义指针变量的一般形式为:
基类型 *指针变量名;
下面都是合法的定义:

1

2

float*pointer_3;// pointer_3是指向单精度型数据的指针变量

char*pointer_4;// pointer_4是指向字符型数据的指针变量


请注意:指针变量名是pointer_3和pointer_4,而不是*pointer_3和*pointer_4,即“*”不是指针变量名的一部分,在定义变量时在变量名前加一个“*”表示该变量是指针变量。

那么,怎样使一个指针变量指向另一个变量呢?只需要把被指向的变量的地址赋给指针变量即可。例如:

1

2

pointer_1=&i;//将变量i的地址存放到指针变量pointer_1中

pointer_2=&j;//将变量j的地址存放到指针变量pointer_2中


这样,pointer_1就指向了变量i,pointer_2就指向了变量j。见图。


一般的C++编译系统为每一个指针变量分配4个字节的存储单元,用来存放变量的地址。

在定义指针变量时要注意:不能用一个整数给一个指针变量赋初值,在定义指针变量时必须指定基类型。
引用指针变量

有两个与指针变量有关的运算符:
&取地址运算符。
*指针运算符(或称间接访问运算符)。

例如:&a为变量a的地址,*p为指针变量p所指向的存储单元。

【例】通过指针变量访问整型变量。

1

2

3

4

5

6

7

8

9

10

11

12

13

#include <iostream>

usingnamespacestd;

intmain( )

{

inta,b;//定义整型变量a,b

int*pointer_1,*pointer_2;//定义指针变量*pointer_1,*pointer_2

a=100;b=10;//对a,b赋值

pointer_1=&a;//把变量a的地址赋给pointer_1

pointer_2=&b;//把变量a的地址赋给pointer_2

cout<<a<<" "<<b<<endl;//输出a和b的值

cout<<*pointer_1<<" "<<*pointer_2<<endl;//输出*pointer_1和*pointer_2的值

return0;

}

运行结果为:

1

2

100 10 (a和b的值)

100 10 (*pointer_1和*pointer_2的值)

请对照图分析。


下面对“&”和“*”运算符再做些说明:
1) 如果已执行了“pointer_1=&a;”语句,请问&*pointer_1的含义是什么?“&”和“*”两个运算符的优先级别相同,但按自右至左方向结合,因此先进行*pointer_1的运算,它就是变量a,再执行&运算。因此,&*pointer_1与&a相同,即变量a的地址。

如果有pointer_2=&*pointer_1;它的作用是将&a(a的地址)赋给pointer_2,如果pointer_2原来指向b,经过重新赋值后它已不再指向b了,而也指向了a。


2) *&a的含义是什么?先进行&a的运算,得a的地址,再进行*运算,即&a所指向的变量,*&a和*pointer_1的作用是一样的(假设已执行了“pointer_1=&a;”),它们等价于变量a。即*&a与a等价,见图。

【例】输入a和b两个整数,按先大后小的顺序输出a和b(用指针变量处理)。

解此题的思路是:设两个指针变量p1和p2,使它们分别指向a和b。使p1指向a和b中的大者,p2指向小者,顺序输出*p1,*p2就实现了按先大后小的顺序输出a和b。按此思路编写程序如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

#include <iostream>

usingnamespacestd;

intmain( )

{

int*p1,*p2,*p,a,b;

cin>>a>>b;//输入两个整数

p1=&a;//使p1指向a

p2=&b;//使p2指向b

if(a<b)//如果a<b就使p1与p2的值交换

{

p=p1;p1=p2;p2=p;//将p1的指向与p2的指向交换

}

cout<<"a="<<a<<" b="<<b<<endl;

cout<<"max="<<*p1<<" min="<<*p2<<endl;

return0;

}

运行情况如下:

1

2

3

4578↙

a=45 b=78

max=78 min=45

输入a的值45,b的值78,由于a<b,将p1的值和p2的值交换,即将p1的指向与p2的指向交换。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 9:01:19

C++快速幂完整实战讲解

C快速幂完整实战讲解1. 背景与意义指数运算&#xff08;a^n&#xff09;是数学与计算机科学中最常见的操作之一。直观的计算方法是把基数 a 乘 n 次&#xff0c;但是当 n 很大&#xff08;如数十亿、上亿甚至 10<sup>18</sup>&#xff09;时&#xff0c;线性循环的…

作者头像 李华
网站建设 2026/4/30 8:59:39

WarcraftHelper:让魔兽争霸3在现代电脑上焕发第二春的必备工具

WarcraftHelper&#xff1a;让魔兽争霸3在现代电脑上焕发第二春的必备工具 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 你是否还记得那些在网吧里通…

作者头像 李华
网站建设 2026/4/30 8:48:53

大模型会聊天,Agent 会干活:差别到底在哪?

这两年&#xff0c;大家都在聊 Agent。 如果不了解它的实现原理&#xff0c;很多人很容易把 Agent 理解成“更聪明一点的大模型”。这种理解作为直觉不算错&#xff0c;而从技术实现上看&#xff0c;更准确的说法是&#xff1a;Agent 不是模型本身&#xff0c;而是一套围绕模型…

作者头像 李华
网站建设 2026/4/30 8:38:45

AMD Ryzen调试工具SMUDebugTool:解锁处理器潜力的终极指南

AMD Ryzen调试工具SMUDebugTool&#xff1a;解锁处理器潜力的终极指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https:…

作者头像 李华