将指向数组的指针传递给函数 (C++)
Passing pointer to an array into a function (C++)
我试图将一个数组传递到我对 build_max_heap 和 max_heapify 的函数调用中,这样我就可以在每次调用后修改该数组,但我收到一条错误消息 "candidate function not viable: no known conversion from 'int [9]' to 'int *&'for 1st argument."
#include <iostream>
#include <string>
using namespace std;
void build_max_heap(int*& array, int size);
void max_heapify(int*& array, int size, int index);
void build_max_heap(int*& array, int size)
{
for(int i = size/2; i>=0; i--)
{
max_heapify(array, i);
}
}
void max_heapify(int*& array, int size, int index)
{
int leftChild = 2*index+1;
int rightChild = 2*index+2;
int largest;
int heap_size = size;
if( leftChild <= heap_size && array[leftChild] > array[index])
largest = leftChild;
else
largest = index;
if(rightChild <= heap_size && array[rightChild] > array[largest])
largest = rightChild;
if(largest != index) {
int tempArray = array[index];
array[index] = array[largest];
array[largest] = tempArray;
max_heapify(array, heap_size, largest);
}
}
int main()
{
int array[]={5,3,17,10,84,19,6,22,9};
int size = sizeof(array)/sizeof(array[0]);
build_max_heap(array, size);
return 0;
}
int array[]={5,3,17,10,84,19,6,22,9};
虽然 array
可以衰减为指针 int*
作为函数参数传递,但指针不能作为 "non-const reference" int*&
传递,因为它是不可变的(它是一个 常量 地址)。您可以像这样将其作为 const 引用传递:
void max_heapify(int* const& array, int size, int index)
// ^^^^^^
然而,这没有多大意义,您可以简单地按值传递指针(数组地址的副本),结果是一样的:调用者处的变量不会改变。 const&
参数的通常用例是传递复制成本高的对象,例如 std::string
。这不适用于指针;制作指针的副本与复制任何基本变量一样便宜。
您应该更改函数以按值获取指针:
void build_max_heap(int* array, int size)
void max_heapify(int* array, int size, int index)
此外,更正 build_max_heap
中对 max_heapify
的调用,为其提供正确数量的参数:
void build_max_heap(int* array, int size)
{
for(int i = size/2; i>=0; i--)
{
max_heapify(array, size, i); // <-- 3 arguments
}
}
我试图将一个数组传递到我对 build_max_heap 和 max_heapify 的函数调用中,这样我就可以在每次调用后修改该数组,但我收到一条错误消息 "candidate function not viable: no known conversion from 'int [9]' to 'int *&'for 1st argument."
#include <iostream>
#include <string>
using namespace std;
void build_max_heap(int*& array, int size);
void max_heapify(int*& array, int size, int index);
void build_max_heap(int*& array, int size)
{
for(int i = size/2; i>=0; i--)
{
max_heapify(array, i);
}
}
void max_heapify(int*& array, int size, int index)
{
int leftChild = 2*index+1;
int rightChild = 2*index+2;
int largest;
int heap_size = size;
if( leftChild <= heap_size && array[leftChild] > array[index])
largest = leftChild;
else
largest = index;
if(rightChild <= heap_size && array[rightChild] > array[largest])
largest = rightChild;
if(largest != index) {
int tempArray = array[index];
array[index] = array[largest];
array[largest] = tempArray;
max_heapify(array, heap_size, largest);
}
}
int main()
{
int array[]={5,3,17,10,84,19,6,22,9};
int size = sizeof(array)/sizeof(array[0]);
build_max_heap(array, size);
return 0;
}
int array[]={5,3,17,10,84,19,6,22,9};
虽然 array
可以衰减为指针 int*
作为函数参数传递,但指针不能作为 "non-const reference" int*&
传递,因为它是不可变的(它是一个 常量 地址)。您可以像这样将其作为 const 引用传递:
void max_heapify(int* const& array, int size, int index)
// ^^^^^^
然而,这没有多大意义,您可以简单地按值传递指针(数组地址的副本),结果是一样的:调用者处的变量不会改变。 const&
参数的通常用例是传递复制成本高的对象,例如 std::string
。这不适用于指针;制作指针的副本与复制任何基本变量一样便宜。
您应该更改函数以按值获取指针:
void build_max_heap(int* array, int size)
void max_heapify(int* array, int size, int index)
此外,更正 build_max_heap
中对 max_heapify
的调用,为其提供正确数量的参数:
void build_max_heap(int* array, int size)
{
for(int i = size/2; i>=0; i--)
{
max_heapify(array, size, i); // <-- 3 arguments
}
}