我被要求编写一个程序,该程序获取一个整数数组arr
及其逻辑大小。当被调用时,它会创建一个只包含arr中的正数的新数组。例如,如果是arr=[3, -1, -3, 0, 6, 4]
,函数应该创建一个包含以下3个元素的数组:[3, 6, 4]
、
具体功能应该是这样的:
void getPosNums4 (int* arr, int arrSize,
int** outPosArrPtr, int* outPosArrSizePtr)
使用指针outPosArrPtr
来更新数组的基地址(包含正数(并且使用指针outPosArrSizePtr
来更新数组逻辑大小。
我很难理解** outPosArrPtr
的含义,以及如何在主函数和函数调用中使用它。我知道我的主函数的cout将是新数组内存中的地址,以及新数组的大小。非常感谢。
#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;
}
}
}
int** outPosArrPtr
是一个指针数组,或者是指向指针的指针。这是C语言中的一个常见概念,我推荐Kernighan和Ritchie的《C编程语言》来了解更多细节。
要了解发生了什么,首先让我们看看指向int的更简单的指针:
int *outPosArrPtr
在C中,指向int的指针可以等效于整数数组:
int outPosArrPtr[]
但是第二个*
呢?
-这意味着您有一个指向int的指针,可以将其用作指针对int的数组。因此,函数void getPosNums4
本身不会创建一个只包含正数的新数组。相反,它返回一个指针数组,其中的指针仅指向原始输入数组int *arr
中正数的存储位置。