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
说明:
如果需要替换在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
解释: