我编写了一个脚本,该脚本接收包含指针数组uint16_t *DataChannel[Evt->ChSize[ch]]
的结构(Evt)。然后,我可以遍历数据并按如下方式打印出值:
for(uint16_t ch=0; ch<sizeof(Evt->DataChannel)/sizeof(Evt->DataChannel[0]); ++ch){
for(int adc_it=0; adc_it<(Evt->ChSize[ch]); ++adc_it){ for(int adc_it=0; adc_it<(Evt->ChSize[ch]); ++adc_it){
std::cout << (Evt->DataChannel)[ch][adc_it] << " ";
}
}
我不明白第二个括号来自([adc_it]),它在做什么以及如何工作。我认为(Evt->DataChannel
)应该是不是数组的uint16_t
,为什么要加上第二个括号?
我试图通过一段简短的代码来复制它:
#include <iostream>
int main()
{
int* test[10];
*(test[0]) = 5;
std::cout << test[0][0] << std::endl; //Gives 5
std::cout << test[0][1] << std::endl; //Seg faults
return 0;
}
再次可以解释test[0][0]
在做什么,因为我不知道为什么运行,但是test[0][1]
却失败了?
欢呼 唐
答案 0 :(得分:1)
已经是第一部分
int* test[10];
*(test[0]) = 5;
是未定义的行为,因为您取消引用了未初始化的指针值。
说明:
int* test[10]
是由10个指向整数的指针组成的数组,每个指针
没有初始化并且绝对没有指向一个内存
您已保留存储整数。
test[0]
给出未初始化的指针;这句话已经是
UB
*(test[0]) = 5
绝对取消引用任意指针值
UB
尝试:
int* test[10];
int firstLine[5] = { 1,2,3,4,5 };
test[0] = firstLine;
cout << test[0][0]; // gives 1, firstLine[0]
cout << test[0][1]; // gives 2, is the same as firstLine[1]
// cout << test[1][0]; // undefined behaviour, the second pointer in array test is not initialized
答案 1 :(得分:1)
C ++允许在取消引用指针时使用数组符号[
]
。
在最简单的情况下,您可以这样说:
char *ptr = new char[10];
这将创建一个指向char的指针,该指针指向由new[]
分配的十个字符的数组中的第一个字符。
这样做之后:
char ch = *ptr;
和
char ch = ptr[0];
做完全一样的事情。但是,由于数组中有10个字符,因此您也可以说:
char ch5 = ptr[5];
访问位于数组上方的元素。
这导致C ++(和C,起源于)的等效性:
ptr[x];
等同于:
*(ptr + x);
对于ptr
引用的任何指针/数组和索引x
的引用。