我正在开展一个Arduino项目。我试图将byte
pointer
传递给function
,并让function
计算指针引用的数据大小。但是,当我让指针引用一个字节时,sizeof()
返回2.我编写了以下代码片段来尝试调试:
byte b;
byte *byteptr;
byteptr = &b;
print("sizeof(b): ");
println(sizeof(b));
print("sizeof(*byteptr) pointing to byte: ");
println(sizeof(*byteptr));
print("sizeof(byteptr) pointing to byte: ");
println(sizeof(byteptr));
打印结果是:
sizeof(b): 1
sizeof(*byteptr) pointing to byte: 1
sizeof(byteptr) pointing to byte: 2
所以一个字节的大小是1,但是通过指针它的2 ??
答案 0 :(得分:6)
看来在Arduino上,指针是16位。我相信你的困惑源于*
在这种情况下的含义。
sizeof(*byteptr)
相当于sizeof(byte)
。 *
未指示指针类型,它表示解除引用存储在byteptr中的指针。因此,它是1个字节,您可以从byte
类型中获得。
sizeof(byteptr)
不会取消引用指针,因此,指针本身的大小,在此系统上似乎是2个字节/ 16位。
请考虑以下事项:
#include "iostream"
using namespace std;
int main()
{
char a = 1;
char* aP = &a;
cout << "sizeof(char): " << sizeof(char) << endl;
cout << "sizeof(char*): " << sizeof(char*) << endl;
cout << "sizeof(a): " << sizeof(a) << endl;
cout << "sizeof(aP): " << sizeof(aP) << endl;
cout << "sizeof(*aP): " << sizeof(*aP) << endl;
}
输出(在64位OS /编译器上):
sizeof(char): 1
sizeof(char*): 8
sizeof(a): 1
sizeof(aP): 8
sizeof(*aP): 1
答案 1 :(得分:1)
@Maseb我认为您已经很好地讨论了解除引用指针的大小与指针本身的实际大小之间的差异。我只是补充说sizeof(byte_pointer)
必须足够大,以便可能存储字节值的每个存储空间地址都适合指针的存储器宽度。例如,如果您的Arduino上有32,000个字节的存储空间,那么您可能会有一个需要指向地址32,000的指针。由于2 ^ 15约为32,000,因此需要14或15位来为每个存储器存储位置创建唯一的地址。我们将指针地址空间长度设置为4位的块。因此,Arduino的指针地址空间为16位,sizeof(byte_pointer)为2字节或16位。
话虽如此,我也会继续回答你的另一个问题。如果需要传递数组和大小,只需创建自己的包含这两个数据元素的结构。然后你可以将指针传递给这个包含大小的模板化结构(这是C ++数组容器的基本实现)。
我已经编写了下面的简短代码示例,演示了如何使用size元素为数组创建自己的模板,然后使用该size元素迭代元素。
template<int N>
struct My_Array{
int size = N;
int elem[N];
};
//create the pointer to the struct
My_Array<3>* ma3 = new My_Array<3>;
void setup() {
//now fill the array element
for(int i=0; i < ma3->size; i++) {
ma3->elem[0]=i;
}
Serial.begin(9600);
//now you can use the size value to iterate over the elements
Serial.print("ma3 is this big: ");
Serial.println(ma3->size);
Serial.println("The array values are:");
Serial.print("\t[");
for(int i=0; i<ma3->size; i++) {
Serial.print(ma3->elem[i]);
if(i < ma3->size-1) Serial.print(", ");
}
Serial.println("]");
}
void loop() {
while(true) { /* do nothing */ }
}