计算数组最大元素的位置。 function returns 最大元素。通过指针和 pos 传递数组。通过参考

Calculates the position of the max element for array. function returns the max element. pass the array by the pointer and the pos. by the reference

我的大学作业有点问题。我真的不明白指针和引用是怎么回事。谁能指出我哪里出错了??

using namespace std;
int i, n, maax, *position;
void tablica()
{
    int tab[n];
    cout<<"enter data:"<<endl;
    for (i=0; i<n; i++)
    {
        cin>>tab[i];
    }
    maax = tab[0];
    for (i=0; i<n; i++)
    {
        if (maax<tab[i])
        {
            maax=tab[i];
            *position=i+1;
        }
    }
}

int main()
{
    cout<<"array size:"<<endl;
    cin>>n;
    tablica();
    cout<<"max el. position is: "<<&position<<endl;
    return 0;
}

您不应该使用全局变量(参见 Are global variables bad?). int tab[n]; is not standard C++, its a variable length array that is only available as extension on some compilers (see Why aren't variable-length arrays part of the C++ standard?). The segfault is because you never allocate memory for the position, it is initialized because its a global, but it doesnt point to an int (see )。

您不需要任何数组来获取最大值和位置。并且无需在您的代码中使用指针。在读取输入和 return 函数结果而不是使用全局变量的同一循环中确定最大值和位置:

#include <iostream>

int tablica(int n) {
    std::cout<<"enter data:\n";
    
    int max = 0;
    int max_pos = 0;
    std::cin >> max;
    
    for (int i=1; i<n; i++) {
        int number = 0;
        std::cin>>number;        
        if (max<number) {
            max=number;
            max_pos = i;
        }
    }
    return max_pos;
}

int main()
{
    std::cout<<"input size:\n";
    int n;
    std::cin>>n;
    int position = tablica(n);
    std::cout<<"max el. position is: "<< position << "\n";
    return 0;
}

看看函数应该做什么:

"函数 returns 最大元素。通过指针传递数组,通过引用传递 pos。"

它不应该读取任何数组元素。
它不应在全局变量中接收或 return 值。
它不应该使用指向该位置的指针。

应该传递一个数组(作为指针)和某处存储最大位置(作为参考),return最大值。

也就是说它的原型应该是这样的

int tablica(const int* input, int size, int& max_position)

main 应该看起来像这样:

int main()
{
    int n = 0;
    cout << "Array size: " << endl;
    cin >> n;
    int* data = new int[n];
    for (int i = 0; i < n; i++)
    {
        cin >> data[i];   
    }
    int position = -1;
    int max_element = tablica(data, n, position);
    cout << "The maximum element is " << max_element << ", at index " << position << endl;
    delete [] data;
}

作为练习实施 tablica

当然,我们可以为您提供一些帮助。但是指针和引用的整个主题不能在 SO 的简短回答中涵盖。你需要读一本书。

下面会很简化,实际情况要多得多。但让我们从这个简单的解释开始吧。

让我给你一个典型的例子,它经常在 C 或非常早期的 C++ 书籍中使用。查看应该交换 2 个变量值的函数 swap

#include <iostream>

void swap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
}

int main() {
    int a = 1, b = 2;
    swap(a, b);
    std::cout << "a: " << a << "\tb: " << b << '\n';
}

我们希望调用函数swap后,a中包含2,b中包含1。但事实并非如此。因为在这种情况下(默认情况下)赋予函数 swap 的变量是按值 传递的 。因此,编译器将生成一些代码并将变量“a”和“b”的值复制到一些本地内部存储中,也可以使用名称“a”和“b”访问。所以,原来的“a”和“b”永远不会被触及或修改。通过按值 传递变量 ,副本将是 mdae。这通常是有意的,但在这个例子中不起作用。

下一个发展阶段是指针。指针也是一个包含值的变量。但这次是内存中另一个变量的地址。如果你有一个像 int a=3; 这样的变量,那么 3 就存储在内存中的某个地方(由链接器的编译器决定),你可以访问名为“a”的内存区域。

一个指针可以存储这个变量的内存地址。所以不是变量“a”的值3,而是变量“a”在内存中的地址。指针 指向 到存储 3 的内存区域。如果要访问此值,则需要使用 * operator 取消引用指针。而要获取变量'a'的地址,可以写成&a。但这有什么帮助?

它可以帮助您间接地从函数中获取修改值或结果值。示例:

#include <iostream>

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int a = 1, b = 2;
    swap(&a, &b);
    std::cout << "a: " << a << "\tb: " << b << '\n';
}

main中,我们获取变量“a”和“b”的地址并将其提供给函数。函数的地址(指针)现在将作为值提供给函数。将创建指针的副本(实际上不是),但这并没有什么害处,因为我们现在可以通过取消引用指针来修改变量的原始值。然后函数结束,我们会在原始变量“a”和“b”中找到正确的值。

但是,众所周知,指针难以理解并且很容易出错。因此发明了“参考”。它是普通变量的别名。好的一点是,如果您将引用传递给该函数,那么您可以立即修改原始值。这让事情变得非常方便。

swap 函数可以写成

#include <iostream>

void swap(int &a, int &b) {
    int temp = a;
    a = b;
    b = temp;
}

int main() {
    int a = 1, b = 2;
    swap(a, b);
    std::cout << "a: " << a << "\tb: " << b << '\n';
}

这给出了预期的结果。而且要简单得多。


现在开始你的代码。首先,VLA(可变长度数组),即 int tab[n]; 其中 'n' 不是编译时常量,不是 C++ 语言的一部分。你不能使用它们。您可以而且应该使用 std::vector 代替,但您还没有了解它。所以我们将使用 new 来动态分配一些内存。请注意:实际上,new,不应使用自有内存和 C 风格数组的原始指针。但无论如何。

那我们看看你的要求

function returns the max element. pass the array by the pointer and the pos. by the reference

所以,我们需要一个函数来计算数组中的最大元素,然后return这个值,另外将最大元素的位置复制到一个变量中,给函数作为参考。我们将为数组的大小添加一个额外的参数,因为我们不会在这里使用 VLA。数组将由指针给出。

因此您的函数原型将是:

int getMaxElement(int *array, int sizeOfArray, int& positionOfMaxValue)

为了实现这样的功能,我们创建了一个内部变量来保存最大值,稍后我们将 return。然后,我们将循环中的所有值与这个最大值进行比较,如果我们找到一个更大的值,那么我们将存储这个新结果。作为初始值,我们可以简单地取数组的第一个值。

示例:

#include <iostream>

int getMaxElement(int* array, int sizeOfArray, int& positionOfMaxValue) {
    int resultingMaxValue = 0;
    if (sizeOfArray > 0) {
        resultingMaxValue = array[0];

        for (int i = 0; i < sizeOfArray; ++i) {
            if (array[i] > resultingMaxValue) {
                resultingMaxValue = array[i];
                positionOfMaxValue = i;
            }
        }
    }
    return resultingMaxValue;
}


int main() {
    // Get array size from user
    std::cout << "\nPlease enter the array size:  ";
    int arraySize = 0;
    std::cin >> arraySize;

    // Create an array
    int* array = new int[arraySize];

    // Read all values into the array
    for (int i = 0; i < arraySize; ++i)
        std::cin >> array[i];

    // Now calculate the max value and position of the max value
    int position = 0;
    int maxValue = getMaxElement(array, arraySize, position);

    // Show result
    std::cout << "\n\nResult:\nThe maximum value '" << maxValue << "' is at position " << position << '\n';

    delete[] array;
}

请记住:这是一个非常简单的解释