用户_29571846
发布于 2026-06-22 / 2 阅读
0
0

C++ 指针基础、地址取值、指针与数组关系详解

一、前言

指针是 C/C++ 核心特色,直接操作内存地址,是理解数组、函数传址、引用的关键。本篇讲解内存地址、指针定义、解引用、指针与数组联动,配套完整可运行示例。

二、内存地址与取地址符 &

程序变量存储在内存,每个变量拥有唯一内存编号即地址

&变量名:取出变量内存地址。

cpp

运行

#include <iostream>
using namespace std;
int main()
{
    int num = 100;
    // &num 获取num的内存地址
    cout << "变量值:" << num << endl;
    cout << "变量地址:" << &num << endl;
    return 0;
}

输出为十六进制地址数字,每次运行地址会变化。

三、指针变量定义与解引用 *

1. 指针语法

数据类型 *指针名;

指针只能存储对应类型变量的地址,int 指针存 int 地址,double 指针存 double 地址。

cpp

运行

int a = 20;
int *p;  // 定义int类型指针p
p = &a;  // 将a的地址存入指针p

2. 解引用 *p

*指针变量:访问指针存储地址对应的内存数据,可读写。

cpp

运行

int a = 20;
int *p = &a;
cout << p << endl;   // 输出a的地址
cout << *p << endl;  // 输出a的值20
*p = 999;            // 通过指针修改原变量a的值
cout << a << endl;   // 输出999

区分两个 *:定义时int *p代表指针;使用时*p代表解引用取值。

四、空指针 nullptr

未赋值的指针为野指针,访问会程序崩溃,用nullptr初始化空指针。

cpp

运行

int *p = nullptr;
// 判断指针是否为空
if(p == nullptr)
{
    cout << "空指针,无法取值" << endl;
}

禁止对空指针执行*p解引用操作。

五、指针与一维数组

数组名本质是数组首元素的常量指针。

cpp

运行

int arr[4] = {10,20,30,40};
// arr等价于&arr[0]
int *p = arr;
cout << *p << endl; // 输出10
// 指针偏移:p+1向后移动一个int长度,指向第二个元素
cout << *(p+1) << endl; // 20
cout << *(p+2) << endl; // 30

数组下标arr[i]等价于*(arr+i),两种写法完全等效。

循环遍历数组指针写法:

cpp

运行

int arr[4] = {1,2,3,4};
int *p = arr;
for(int i = 0; i < 4; i++)
{
    cout << *(p+i) << " ";
}

六、指针做函数参数(地址传递)

值传递无法修改外部变量,指针传递可直接修改实参原始数据。

案例:交换两个数字

cpp

运行

#include <iostream>
using namespace std;
// 指针形参接收变量地址
void swapNum(int *x, int *y)
{
    int temp = *x;
    *x = *y;
    *y = temp;
}
int main()
{
    int a = 10, b = 20;
    swapNum(&a, &b); // 传入变量地址
    cout << a << " " << b; // 输出20 10,数值成功交换
    return 0;
}

七、新手易错点

  1. 指针类型与变量类型不匹配:double *p = &intNum;编译报错

  2. 野指针直接解引用,程序直接崩溃

  3. 混淆&取地址、*解引用两种运算符作用

  4. 数组名是常量指针,不可执行arr++修改地址

八、综合实战:指针遍历数组求最值

cpp

运行

#include <iostream>
using namespace std;
void getMaxMin(int *arr, int len, int *max, int *min)
{
    *max = arr[0];
    *min = arr[0];
    for(int i = 1; i < len; i++)
    {
        if(arr[i] > *max) *max = arr[i];
        if(arr[i] < *min) *min = arr[i];
    }
}
int main()
{
    int score[5] = {88,95,62,77,91};
    int maxVal, minVal;
    getMaxMin(score,5,&maxVal,&minVal);
    cout << "最高分:" << maxVal << " 最低分:" << minVal;
    return 0;
}

九、下期预告

下一篇:C++ 引用 &、常量引用、指针与引用核心区别


评论