当我尝试使用指针将数值分配给数组对象时出现类型不匹配错误

Getting mismatched types error when i tried to assign numeric value to array object using pointer

我启动了一个包含 6 个元素的数组,并尝试使用名为 'print' 的函数打印它。我使用了 stl 库中的数组对象。我将数组对象的地址传递给打印函数。当我尝试在打印函数中更改数组对象的值时,出现类型不匹配错误。

#include <bits/stdc++.h>
using namespace std;
void print(array<int, 6> *arr){
    for(int i : *arr){
        cout<<i<<" ";
    }
    *(*arr+2)=2;
    cout<<endl;
}
int main(){
    array<int, 6> arr2={1, 2, 3, 4, 5, 6};
    print(&arr2);
    print(&arr2);
}

此声明

*(*arr+2)=2;

没有意义。例如,运算符 + 没有为 class 模板 std::array 定义,因此该表达式 *arr+2 无效。

你可以写

( *arr )[2] = 2;

或者例如

*( ( *arr ).begin() + 2 ) = 2;

*(*arr+2)=2; 中,您引用 array 指针并尝试向其添加 2,然后取消引用该结果以分配 2。我 假设 你想将 2 分配给 array.

中索引 2 处的元素

虽然这里不需要使用指针,但请参考 array

还有,.

#include <array>    // include the proper header files
#include <iostream>

void print(std::array<int, 6>& arr) {   // by reference
    for (int i : arr) {
        std::cout << i << ' ';
    }
    arr[2] = 2;        // assign 2 to the element at index 2
    std::cout << '\n'; // std::endl flushes the stream which is usually uncessary
}

int main() {
    std::array<int, 6> arr2 = {1, 2, 3, 4, 5, 6};
    print(arr2);        // and don't take the array address here
    print(arr2);
}

如果您真的想在这里使用指针,这可能是一个选项:

#include <array>
#include <iostream>

void print(std::array<int, 6>* arr_ptr) {  // pointer
    if (arr_ptr == nullptr) return;        // check that it's pointing at something
    std::array<int, 6>& arr = *arr_ptr;    // dereference it

    for (int i : arr) {
        std::cout << i << ' ';
    }
    arr[2] = 2;
    std::cout << '\n';
}

int main() {
    std::array<int, 6> arr2 = {1, 2, 3, 4, 5, 6};
    print(&arr2);
    print(&arr2);
}
*(*arr+2)=2;

相当于

(*arr)[2] = 2;

if arr 是指向数组的指针。我想这就是你要找的。但是 std::array 实例是 而不是 这个意义上的数组。它是一个封装数组的对象,模拟底层数组的一些属性,但不能与底层数组互换使用。特别是,std::array 对象不会像实际数组那样退化为指针,您的代码似乎正试图依赖于此。

你可以改为

*((*arr).data() + 2) = 2;

或者更通俗地说,

*(arr->data() + 2) = 2;

利用数组到指针的衰减。或者你可以做

arr->data()[2] = 2;

。但其中 none 与 ...

一样清晰或直接
(*arr)[2] = 2;

... 已经提到过,如果您必须使用指向 std::array 的指针而不是对一个的引用,那么您 应该 这样做。

首先注意std::array没有operator+。所以当你写 expression:

*arr+2 // INCORRECT 

在上面的表达式中,您取消引用指向 std::array 的指针,然后将 2 添加到结果中。但是正如我一开始所说,std::array 没有 operator+,这个表达式是 不正确的

限制

其次 你的程序有一个限制,即函数 print 只能接受指向 std::array 的指针 6 个元素。因此,如果您尝试将指针传递给一些不同大小的 std::array,那么您的程序将无法运行。

解决方案

您可以通过以下方式解决这些问题:

  1. 通过引用std::array
  2. 使用模板。特别是,使用 模板非类型参数 .

使用模板非类型参数的 优势 是现在您可以使用不同大小的 std::array 调用函数 print,如下所示。

#include <iostream>
#include <array>

template<std::size_t N> 
void print(std::array<int, N> &arr){ //by reference
    for(const int &i : arr){
        std::cout<<i<<" ";
    }
    arr.at(2) = 2; //use at() member function so that you don't get undefined behavior
    std::cout<<std::endl;
}
int main(){
    std::array<int, 6> arr2={1, 2, 3, 4, 5, 6};
    print(arr2);
    
    std::array<int, 10> arr3 = {1,2,4,3,5,6,7,8,9,10};
    print(arr3);
}

我所做的一些修改包括:

  1. 删除了 #include <bits/stdc++.h>,只包含 headers 需要的内容。
  2. 使用过的模板。特别是,通过使用 模板非类型参数 .
  3. 消除了限制
  4. 通过了 std::array 参考。也就是说,不需要传递指向 std::array 的指针。我们可以通过引用传递 std::array
  5. 使用了 at() 成员函数,这样我们就不会越界,也不会出现未定义的行为。