在函数参数中,一级指针(int*)和二级指针(int**)的核心区别在于能修改的数据层级:一级指针可修改指针指向的变量值,而二级指针可修改一级指针本身(包括其指向或分配的内存)
一级指针作为函数参数
作用:通过一级指针,函数可以修改指针所指向的变量的值,但无法修改指针自身的指向或为其分配新内存(因为函数接收的是指针的副本)。
示例 1:用一级指针修改外部变量的值
#include <iostream>
using namespace std;// 一级指针作为参数:修改指针指向的变量值
void modifyValue(int* p)
{*p = 100; // 正确:修改p指向的变量(外部的x)
}int main()
{int x = 10;int* ptr = &x;cout << "修改前:x = " << x << endl; // 输出:10modifyValue(ptr); // 传入一级指针cout << "修改后:x = " << x << endl; // 输出:100(x被修改)return 0;
}
示例 2:一级指针无法修改自身指向
#include <iostream>
using namespace std;// 尝试通过一级指针修改指针的指向(失败)
void changePointer(int* p)
{int y = 20;p = &y; // 仅修改函数内的副本,外部ptr不受影响
}int main()
{int x = 10;int* ptr = &x;cout << "修改前:*ptr = " << *ptr << endl; // 输出:10changePointer(ptr);cout << "修改后:*ptr = " << *ptr << endl; // 仍输出:10(ptr指向未变)return 0;
}
原因:函数接收的是ptr的副本,修改副本的指向不会影响外部原始指针。
二、二级指针作为函数参数
作用:通过二级指针,函数可以修改一级指针本身(包括其指向、分配的内存等),因为二级指针存储了一级指针的地址。
示例 3:用二级指针修改一级指针的指向
#include <iostream>
using namespace std;// 二级指针作为参数:修改一级指针的指向
void changePointer(int** pp)
{int y = 20;*pp = &y; // 通过二级指针修改一级指针(ptr)的指向
}int main()
{int x = 10;int* ptr = &x;cout << "修改前:*ptr = " << *ptr << endl; // 输出:10changePointer(&ptr); // 传入一级指针的地址(二级指针)cout << "修改后:*ptr = " << *ptr << endl; // 输出:20(ptr指向已改为y)return 0;
}
示例 4:用二级指针为一级指针动态分配内存
#include <iostream>
using namespace std;// 二级指针作为参数:为外部一级指针分配内存
void allocMemory(int** pp, int size)
{*pp = new int[size]; // 为外部指针分配内存for (int i = 0; i < size; i++) {(*pp)[i] = i; // 初始化数组}
}int main()
{int* arr = nullptr; // 未分配内存的一级指针allocMemory(&arr, 5); // 传入arr的地址(二级指针)// 验证内存分配结果cout << "数组元素:";for (int i = 0; i < 5; i++) {cout << arr[i] << " "; // 输出:0 1 2 3 4}delete[] arr; // 释放内存return 0;
}