C++ 在数组中存储';这是一个指针
我想在数组中存储一个元素,因为给定数组的参数是指向实际数组的指针(以防止不必要地复制数据)C++ 在数组中存储';这是一个指针,c++,arduino,C++,Arduino,我想在数组中存储一个元素,因为给定数组的参数是指向实际数组的指针(以防止不必要地复制数据) bool存储元件阵列(传感器元件,传感器*传感器){ 对于(int i=0;i时,C++缺少内置内存视图原语。code>std::vector用于桌面代码,但在有限MCU的嵌入式程序中使用它是相当值得怀疑的。在这种情况下,您可能需要/希望编写包含指针和大小的自己的类型,例如: template<typename T> struct ArrayView { T* ptr; std
bool存储元件阵列(传感器元件,传感器*传感器){
对于(int i=0;i<(sizeof(传感器)/sizeof(元件)-1);i++){
如果(!sensors[i].getIsObject()){//检查当前元素是否已经是“真实”传感器,或者只是存储传感器的内存保留部分
helper::debug(F(“存储在索引中”),false,false);
helper::debugInt(i,true,false);
传感器[i]=元件;
打破
}
}
}
传感器[5];
我想将元素
存储到传感器
,而传感器
应该只作为数组传感器[5]
的指针/引用,因为我需要指定元素应该存储到哪个数组。如何实现这一点?数组的“指针/引用”似乎指出了理解指针如何与数组相关时的一些问题
当您将指针指向数组元素,并将数组“传递”给这样的函数时,您触发了数组到指针的衰减,最终传递的是指向第一个元素的指针
#include <iostream>
void f(int* p) {
std::cout << p << '\n';
}
int main() {
int arr[5];
// both are exactly the same
f(arr);
f(&arr[0]);
}
也就是说,如果要传递数组,则需要某种方法来评估大小,以避免越界访问;一种方法是将其作为另一个参数传递
也就是说,最好使用std::array
,然后将其作为引用传递。这样你就避免了所有的指针把戏,并自动传递了大小。缺点是您需要在编译时知道大小
不幸的是,在提供
template<typename T>
struct ArrayView {
T* ptr;
std::size_t sz;
public:
template<int arrSize>
ArrayView(T (&arr)[arrSize]) : ptr(arr), sz(arrSize) { }
T& operator[](int i) { return ptr[i]; }
std::size_t size() const { return sz; }
};
模板
结构阵列视图{
T*ptr;
标准::尺寸t sz;
公众:
样板
ArrayView(T(&arr)[arrSize]):ptr(arr),sz(arrSize){
T&运算符[](int i){return ptr[i];}
std::size_t size()常量{return sz;}
};
指针的大小是指针本身的大小,而不是它可能指向的大小。当您需要将“数组”传递给函数时,请始终将大小作为参数包含在内。很好,谢谢!
#include <iostream>
#include <algorithm>
void set(int val, int ix, int* storage) {
storage[ix] = val;
}
int main() {
int values[10];
std::fill(std::begin(values), std::end(values), 0);
set(42, 3, values);
for (auto v : values) {
std::cout << v << '\n';
}
}
template<typename T>
struct ArrayView {
T* ptr;
std::size_t sz;
public:
template<int arrSize>
ArrayView(T (&arr)[arrSize]) : ptr(arr), sz(arrSize) { }
T& operator[](int i) { return ptr[i]; }
std::size_t size() const { return sz; }
};