前言

这一节内容我们将正式进入指针的学习,这一节内容很重要!!!可能会涉及到一些之前所学习的相关知识,如果你还有不明白的,可以去温习一下之前所学C++基础教程

C++ 指针

C++ 中的 指针 就像一个“地址簿”,它记录了存储某个值的“房子”(内存位置)的地址。学习指针是 C++ 编程的重要部分,因为它不仅可以让你写出更高效的代码,还能完成像 动态内存分配 这样的高级操作,这些是没有指针无法实现的。

什么是地址?

每个变量(比如 intchar 等)在计算机的内存中都占据一个“房子”(内存位置)。这个房子有自己的“地址”,就像你家的门牌号一样,唯一且能指引我们找到这个变量存储在哪里。

在 C++ 中,可以使用符号 &(取地址符)来获取变量的地址。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>

using namespace std;

int main() {
int var1; // 定义一个整数变量
char var2[10]; // 定义一个字符数组

cout << "var1 变量的地址: ";
cout << &var1 << endl;

cout << "var2 变量的地址: ";
cout << &var2 << endl;

return 0;
}

输出的地址是什么?

当这段代码运行时,会输出类似下面的结果:

1
2
var1 变量的地址: 0xbfebd5c0
var2 变量的地址: 0xbfebd5b6

这些看起来像一串奇怪的数字(比如 0xbfebd5c0),其实是计算机给变量分配的“内存地址”。通过这些地址,程序可以快速找到变量的位置,访问或者操作它的值。

更通俗的比喻

假设你的内存是一个巨大的公寓楼,每个房间都有一个房号(内存地址):

  • var1 是住在某个房间的小明,他的房间号是 0xbfebd5c0
  • var2 是住在另一个房间的小红,她的房间号是 0xbfebd5b6

如果你想找小明或小红,只需要知道他们的房间号(地址),然后直接去找就可以了。

小总结

  • 变量 是房间里的住户。
  • 内存地址 是房间号。
  • & 可以查到变量住在哪个房间(内存地址)。

指针就是“记住房间号”的一种方式,后面你会学习如何用指针操作变量的值,让编程更加灵活和高效!

什么是指针?

指针是一个变量,存放着另一个变量的“地址”(类似于一个门牌号)。通过这个门牌号,我们可以找到并操作那个变量。
想象一下,一个指针就像地图上的标记,指向某个具体位置(变量所在的内存地址)。


如何声明一个指针?

在 C++ 中,声明指针的方式如下:

1
type *var-name;

这里:

  • type 是指针指向的变量类型,比如 intfloat 等。
  • * 告诉编译器这个变量是一个指针,而不是普通变量。
  • var-name 是指针变量的名称。

例如:

1
2
3
4
int    *ip;    // 一个整型指针
double *dp; // 一个 double 型指针
float *fp; // 一个浮点型指针
char *ch; // 一个字符型指针

注意* 在这里的作用是“定义指针”,而不是数学中的乘号。


指针的用法

指针的主要操作可以分为以下几步:

  1. 定义指针变量:告诉编译器,你要存储某个变量的地址。
  2. 存储地址到指针变量:通过取地址符 &,获取变量的内存地址,并存储到指针中。
  3. 访问地址对应的值:通过解引用符 *,获取指针指向的变量的值。

例子

我们通过一个简单的程序来说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;

int main() {
int var = 20; // 定义一个整数变量
int *ip; // 定义一个指向整数的指针

ip = &var; // 将 var 的地址赋值给指针 ip

// 输出 var 的值
cout << "Value of var variable: " << var << endl;

// 输出存储在指针 ip 中的地址
cout << "Address stored in ip variable: " << ip << endl;

// 通过指针访问 var 的值
cout << "Value of *ip variable: " << *ip << endl;

return 0;
}

运行结果:

1
2
3
Value of var variable: 20
Address stored in ip variable: 0xbfc601ac
Value of *ip variable: 20

程序的核心解释

  1. int var = 20;
    定义一个整数变量,值为 20。

  2. int *ip;
    定义了一个指针变量 ip,它可以存储一个整数变量的地址。

  3. ip = &var;
    使用取地址符 &,获取变量 var 的地址,并存储到指针 ip 中。
    此时,ip 的值就是 var 在内存中的地址。

  4. 输出指针指向的值
    使用解引用符 *ip,可以通过指针访问变量 var 的值。
    也就是说,*ip 等价于 var


指针的本质

无论指针指向的是整数、浮点数还是字符,指针的实际值都是内存地址(一个十六进制数)。
指针的类型(比如 int*char*)是为了告诉编译器,指针指向的变量是什么类型,从而正确操作。


C++ 中的一些指针概念

概念 描述
空指针 指向“空地址”的指针(NULL)。如果指针未初始化,最好设为 NULL,避免意外使用。
指针运算 可以对指针做加减法(比如指向下一个元素)。
指针与数组 数组的名称本质上是一个指向数组第一个元素的指针。
指针数组 数组可以存储多个指针,称为“指针数组”。
指向指针的指针 一个指针可以指向另一个指针,称为“二级指针”或“指向指针的指针”。
传递指针给函数 通过指针传参,可以直接操作原始数据,而不是拷贝数据。
从函数返回指针 函数可以返回一个指针,指向局部变量、静态变量或动态分配的内存。

通俗总结

  1. 指针是什么?
    它是“一个变量的地址”。

  2. 指针能干什么?

    • 指向一个变量,间接操作它的值。
    • 动态管理内存(比如数组的大小可以运行时确定)。
  3. 如何理解指针?

    • 想象成地图上的标记:指针记录了某个地点(变量)的地址。通过标记,我们可以访问这个地点的内容。
  4. 为什么要用指针?
    指针让代码更高效,可以节省内存,快速定位变量,实现复杂的数据结构(如链表、树等)。