一级指针和二级指针作为函数参数的区别

在函数参数中,一级指针(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;  // 输出:10
    modifyValue(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;  // 输出:10
    changePointer(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;  // 输出:10
    changePointer(&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;
}

三、核心区别总结

img

posted @ 2025-10-15 22:17  开心猪扒  阅读(13)  评论(0)    收藏  举报