2016-10-02 2 views
3

Я смущен слайдами в моем курсе C++. С одной стороны, в примере 1 int (* foo) [5] является указателем на целочисленный массив из 5 элементов, но в примере 2 int (* numbers2) [4] указывает на массив массивов (4 массива) типа integer. Как эти два имеют одну и ту же декларацию lefthand, но имеют разные типы?Указатели Confusion в C++

#include <iostream> 
using std::cout; 
using std::endl; 


int main() { 

    //Example1 
    int numbers[5] = { 1,2,3,4,5 }; 
    int(*foo)[5] = &numbers; 
    int *foo1 = *foo; 


    //Example2 
    int numRows = 3; 
    int(*numbers2)[4] = new int[numRows][4]; 
    delete[] numbers2; 


    return 0; 

} 
+1

'numbers2' указывает на * первый элемент * динамического массива. Это теперь работает над «новыми» выражениями. –

+2

Подумайте немного ... Если вы выделите простой массив целых чисел, тогда 'new int [numRows]' return 'int *'. Поэтому, когда вы выделяете массив массива, вы получаете указатель на массив или 'int (*) [4]' (в вашем конкретном случае). –

+2

«int *» может указывать на одно целое число или на адрес первого элемента массива целых чисел. То же самое относится к указателю на массив. Он может указывать на один массив или адрес первого элемента массива массивов. – Galik

ответ

3

Проверить pointer declaration reference:

Из-за массива к указателю неявного преобразования, указатель на первого элемента массива может быть инициализирован с выражением типа массива:

int a[2]; 
int* p1 = a; // pointer to the first element a[0] (an int) of the array a 

int b[6][3][8]; 
int (*p2)[3][8] = b; // pointer to the first element b[0] of the array b, 
        // which is an array of 3 arrays of 8 ints 

По существу говоря, что lefthand numbers2 и foo указывают на правую сторону.

Таким образом, в следующем numbers2 точку к первому элементу temporary (пока безымянного) массив, который является массивом numRows массивов 4 Интс

int(*numbers2)[4] = new int[numRows][4]; 

В то время как foo указывает на первый элемент numbers, который представляет собой массив из 5 ints

int(*foo)[5] = &numbers; 
1

Описание в вашем примере примера 2 не совсем верно.

Попробуйте сформулировать так, и вы увидите параллелизм.

  • foo является указателем на первый объект, каждый объект представляет собой целочисленный массив из 5 элементов. (Как оказалось, первый из них является единственным)
  • numbers2 является указателем на первый объект, каждый объект представляет собой целочисленный массив из 4 элементов. (Как оказалось, есть в общей сложности numRows из них) тип данных

Указатель не говорит вам количество объектов, которые он указывает на, только тип каждого из них.