C++ 指针传递和指向指针的地址传递之间的区别

C++ 指针传递和指向指针的地址传递之间的区别

本文介绍了在C或C++编程语言中,将“指向指针”和“指针地址”传递给函数之间的区别。众所周知,指针保存变量或任何内存位置的地址。如果指针指向内存位置,则可以用它来更改变量的值。

对于函数来说,任何指针都可以被本身或指针的地址传递。但如果要永久地在函数外部改变指针的内存位置,则必须使用函数内的引用或双指针来捕获,即假设任何内存都是在局部函数内创建的。

然后,它指向由函数捕获的指针,没有任何引用或任何双指针。在这种情况下,由于没有被引用或双指针捕获到函数定义内部,因此主函数内没有任何变化。

程序1:

// C++程序,用于说明指针的概念

#include <iostream>
#include <stdlib.h>
using namespace std;

// 将指针 ptr 的值分配给另一个位置的函数
void foo(int* ptr)
{
    int b = 2;

    // ptr= (int*)malloc(sizeof(int));
    // 它可以代替 ptr=&b 但不会有任何改变
    ptr = &b;
}

// 驱动程序
int main()
{
    int a = 5;
    int* ptr = &a;

    cout << "函数执行前, ptr: " 
        << *ptr << endl; 
    foo(ptr);

    cout << "函数执行后, ptr: " 
        << *ptr << endl; 

    return 0;
}  

输出:

函数执行前, ptr: 5
函数执行后, ptr: 5

说明: 输出没有更改的原因是函数为其创建了一个 复制指针 。因此,指针的地址更改不会反映在函数外部。这可以使用引用或双指针来解决。

程序2:

// C++程序,用于说明指针的概念

#include <iostream>
#include <stdlib.h>
using namespace std;

// 更改指针 ptr
void foo(int* ptr)
{
    int b = 2;

    // 更改只针对 ptr 的新值
    *ptr = b;
}

// 驱动程序
int main()
{

    int a = 5;
    int* ptr = &a;

    cout << "函数执行前,ptr 的新值: " 
        << *ptr << endl; 

    // 调用函数
    foo(ptr);

    cout << "函数执行后,ptr 的新值: " 
        << *ptr << endl; 

    return 0;
}  

输出:

函数执行前,ptr 的新值: 5
函数执行后,ptr 的新值: 2

说明:

C++ 指针传递和指向指针的地址传递之间的区别

如果需要替换在foo()函数结束时存储在ptr中的内存,则必须在foo()函数中使用引用或双指针来捕获ptr。

程序3:

// C++程序,用于说明指针的概念

#include <iostream>
#include <stdlib.h>
using namespace std;

// 在函数中使用双指针来改变内存位置
void foo(int** ptr)
{
    int b = 2;

    // 更改存储在 ptr 中的内存
    *ptr = &b;
}

// 驱动程序
int main()
{

    int a = 5;
    int* ptr = &a;
    cout << "函数执行前,ptr 的新值: " 
        << *ptr << endl; 

    // 调用函数
    foo(&ptr);

    cout << "函数执行后,ptr 的新值: " 
        << *ptr << endl; 

    return 0;
}
// C++程序演示指针的概念
#include <iostream>
#include <stdlib.h>
using namespace std;
int b = 2;
 
// 改变指针ptr1的值的函数
void foo(int** ptr1) { *ptr1 = &b }
 
// 主函数
int main()
{
    int a = 5;
    int* ptr = &a
 
    cout << "函数调用前,"
         << "指针的新值为:" << *ptr << endl;
 
    // 函数调用
    foo(&ptr);
 
    cout << "函数调用后,"
         << "指针的新值为:" << *ptr << endl;
 
    return 0;
}  

输出结果:

函数调用前,指针的新值为:5
函数调用后,指针的新值为:2

解释:

C++ 指针传递和指向指针的地址传递之间的区别

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程