int ** ptr(指向指针的指针)作为 C++ 函数参数是什么意思?

What does int ** ptr (pointer to a pointer) as a C++ function argument mean?

提问人:ArlHob 提问时间:3/23/2022 最后编辑:n0rdArlHob 更新时间:3/25/2022 访问量:419

问:

我被要求编写一个程序来获取整数数组及其逻辑大小。调用时,它会创建一个新数组,仅包含来自 arr 的正数。 例如,如果 ,函数应创建一个包含以下 3 个元素的数组: ,arrarr=[3, -1, -3, 0, 6, 4][3, 6, 4]

具体功能应该是这样的:

void getPosNums4 (int* arr, int arrSize, int** outPosArrPtr, int* outPosArrSizePtr)使用指针更新数组的基址(包含正数),使用指针更新数组的逻辑大小。outPosArrPtroutPosArrSizePtr

我很难理解是什么意思,以及如何在主函数和函数调用中使用它。我知道我的主要函数的 cout 将是新数组内存中的地址,以及新数组的大小。谢谢。** outPosArrPtr

#include <iostream>  
using namespace std;

void getPosNums4(int* arr, int arrSize, int** outPosArrPtr, int* outPosArrSizePtr);

int main(){
    int arr[8]= {3,-1,-3,0,6,4,-5,8};
    int* inputPtr = arr;
    int inputArrSize = 8;

    int* outputArrSizePtr = new int;
    int outputArrSize = 0;
    outputArrSizePtr = &outputArrSize;

    int* outPosArr = new int[outputArrSize];
    int** outPosArrPtr = &outPosArr;
    cout<<"Test function 4: "<<endl;
    getPosNums4(inputPtr, inputArrSize, outPosArrPtr, outputArrSizePtr);
    cout<<outPosArrPtr<<*outputArrSizePtr4<<endl;
    return 0;
}


void getPosNums4(int* arr, int arrSize, int** outPosArrPtr, int* outPosArrSizePtr) {
    for (int i = 0; i < arrSize; i++){
        if (arr[i] > 0){
            *outPosArrPtr[*outPosArrSizePtr] = arr[i];
            *outPosArrSizePtr = *outPosArrSizePtr + 1;
        }
    }
}
C++ 函数 指针参数 传递

评论

1赞 Wisblade 3/23/2022
在全球范围内,这是一种“C语法”,而不是“C++语法”。如果你正在编写自己的代码,我强烈建议你迁移到标准容器,如 、 引用和智能指针,而不是裸指针。你可能无法想象你能用裸露的指针弄得一团糟......如果你不能做其他事情(例如,因为库),那么尽快封装它,避免在代码中的任何地方都给出裸指针。std::vector

答:

2赞 SarahJuliet1510 3/23/2022 #1

int** outPosArrPtr是指针数组,或者是指向指针的指针。这是 C 语言中的一个常见概念,我推荐 Kernighan 和 Ritchie 的 The C Programming Language 来了解更多细节。

要了解发生了什么,首先让我们看一下更简单的指向 int 的指针

int *outPosArrPtr

在 C 语言中,这个指向 int 的指针可以等效于一个整数数组

int outPosArrPtr[]

但是第二个呢?*

-这意味着你有一个指向指向 int 的指针,你可以将其用作指向 int 的指针数组。 因此,该函数本身不会创建一个仅包含正数的新数组。相反,它返回一个指针数组,该指针的指针仅指向原始输入数组中正数的内存位置。void getPosNums4int *arr