当我尝试使用指针将数值分配给数组对象时出现类型不匹配错误
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
,那么您的程序将无法运行。
解决方案
您可以通过以下方式解决这些问题:
- 通过引用
std::array
。
- 使用模板。特别是,使用 模板非类型参数 .
使用模板非类型参数的 优势 是现在您可以使用不同大小的 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);
}
我所做的一些修改包括:
- 删除了
#include <bits/stdc++.h>
,只包含 headers 需要的内容。
- 使用过的模板。特别是,通过使用 模板非类型参数 .
消除了限制
- 通过了
std::array
参考。也就是说,不需要传递指向 std::array
的指针。我们可以通过引用传递 std::array
。
- 使用了
at()
成员函数,这样我们就不会越界,也不会出现未定义的行为。
我启动了一个包含 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
,那么您的程序将无法运行。
解决方案
您可以通过以下方式解决这些问题:
- 通过引用
std::array
。 - 使用模板。特别是,使用 模板非类型参数 .
使用模板非类型参数的 优势 是现在您可以使用不同大小的 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);
}
我所做的一些修改包括:
- 删除了
#include <bits/stdc++.h>
,只包含 headers 需要的内容。 - 使用过的模板。特别是,通过使用 模板非类型参数 . 消除了限制
- 通过了
std::array
参考。也就是说,不需要传递指向std::array
的指针。我们可以通过引用传递std::array
。 - 使用了
at()
成员函数,这样我们就不会越界,也不会出现未定义的行为。