C++ 从函数返回后,指针为空

C++ 从函数返回后,指针为空,c++,function,pointers,C++,Function,Pointers,我将int***发送给一个函数,该函数完成了它的工作,但当我尝试在函数后的外部使用指针时,它是空的。以下是函数: void pointerSort2(int* arr, unsigned int size, char ascend_flag, int*** pointers) { int i, j, *temp; int** sort=new int*[size]; for (i=0;i<size;i++) sort[i]=&arr[i]

我将int***发送给一个函数,该函数完成了它的工作,但当我尝试在函数后的外部使用指针时,它是空的。以下是函数:

void pointerSort2(int* arr, unsigned int size, char ascend_flag, int*** pointers)
{
    int  i, j, *temp;
    int** sort=new int*[size];

    for (i=0;i<size;i++)
        sort[i]=&arr[i];                                                     

    if (ascend_flag==true)
    {
        for (i=0;i<size-1;i++)
        { 
            for(j=0; j<size-1-i;j++)
            {
                if (*sort[j]>*sort[j+1])
                {
                    temp=sort[j];
                    sort[j]=sort[j+1];
                    sort[j+1]=temp;
                }
        }
    }

    pointers=&sort;
}
void pointerSort2(int*arr、无符号int-size、字符递增标志、int***指针)
{
int i,j,*温度;
整数**排序=新整数*[大小];
对于(i=0;i)以下行:
正在导致您的问题。
sort
是指向指针的指针。因此,它是在函数的局部范围内创建的变量

当函数退出时,它将被销毁

尝试删除
&

我们要转到本地指针变量,找到它指向的对象,并更改该值。 指针不是通过引用传递的,它和任何其他参数一样,在堆栈上每次运行时函数调用时都会被复制和销毁

*pointers = sort;

首先,如果这不是分配,那么容器和算法已经存在,可以为您完成所有这些:

容器:
std::vector
std::list
std::deque
排序算法:
std::Sort

通过使用标准库模板,您的大多数问题都会迎刃而解

除此之外,您似乎也没有很好地理解按值传递和按引用传递之间的区别以及指针语义

int***
传递给接受
int***
的函数

如果将函数声明为

void func(int i);
并称之为:

int j = 0;
func(j);
func
i
参数所做的任何更改都不会反映在
j
中。将
j
的副本传递给
func
。如果要存储对
i
参数所做的任何更改,则需要使用引用或指针:

void func(int& i);
// or
void func(int* pI); // requires you to call it via func(&j)
您当前的代码也是如此:

您已经声明了排序函数,如下所示

void pointerSort2(..., int*** pointers);
如果你这么说的话

int*** myPointer = NULL;
pointerSort2(..., myPointer);
您正在按值传递它。这将复制指针的值(当前
NULL
)进入函数的局部变量
指针
。当函数返回时,
myPointer
保持不变。如果您的目标是将更改后的值保留在
myPointer
中,则需要通过引用传递或传递指向
int***
的指针(注意:这种间接级别已经是一种代码味道!)解决这一问题的可能办法是:

void pointerSort2(..., int***& pointers);
// or
void pointerSort2(..., int**** pointers);
这将允许您以以下方式(分别)调用函数:

对于第一个版本,您可以将
指针的值设置为
排序的值,如下所示:

pointers = sort;
*pointers = sort;
由于
pointers
是对
myPointer
的引用(别名),因此
myPointer
的值会发生更改

对于第二个版本,您可以将
指针的值设置为
排序的值,如下所示:

pointers = sort;
*pointers = sort;
由于
pointers
是指向
myPointer
位置的指针,因此您正在设置
myPointer
的实际值

请注意,在这两种情况下,您都将值设置为
sort
(指针的值),而不是
&sort
(指针的地址)

旁注


bool
是一种用于
true
false
值的类型。您的
ascend\u标志
参数最好用作
bool
而不是
char

函数参数
int***指针
是函数的局部变量。此变量将在退出函数

我认为那不是线

pointers=&sort;
应该有

*pointers = sort;

哇。仅从代码来看,我几乎认为这是C代码,除了
新的
std::vector
std::sort
?引用?如果使用这些,就不会有这样的问题。
指针=&sort
应该是
*pointers=sort