了解数组指针的C ++语法

时间:2018-12-12 22:18:37

标签: c++

我编写了一个脚本,该脚本接收包含指针数组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]却失败了?

欢呼 唐

2 个答案:

答案 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的引用。