2014-10-03 4 views
0

Какова разница между:Указатель на массив целых чисел

//Example of "Complicated Array Declarations" from C++ Primer 
int arr[10] = {1,2,3,4,5,6,7,8,9,10}; 
int (*Parr)[10] = &arr; 

И:

int arr[10] = {1,2,3,4,5,6,7,8,9,10}; 
int *Parr = arr; 

Оба являются указателями на массив целых чисел. Но для того, чтобы получить доступ к первому элементу arr в первом фрагменте кода, я должен сделать **Parr тогда как во втором, у меня есть только разыменованием раз *Parr

+1

Нет, второй один * не * указатель на массив. Это указатель на первый элемент массива. –

ответ

6

В первом примере кода

int (*Parr)[10] = &arr; 

Parr является указателем на массив из 10 целых чисел. Он может указывать только на такой объект. Например,

int (*Parr)[10]; 
int a[10]; 
Parr = &a; // OK 
int b[42]; 
Parr = &b; // ERROR, b is of the wrong type 

Во втором примере кода

int *Parr = arr; 

Parr является указателем на int, инициализирован, чтобы указывать на первый элемент arr. Но он может указывать на любой int.

int* Parr; 
int a[10]; 
Parr = &a; // OK, a decays to int* 
int b[42]; 
Parr = &b; // OK, b decays to int* 
int c = 42; 
Parr = &c; // OK, c is an int* 
+0

Не могли бы вы объяснить, почему мне нужно разыгрывать Парра дважды? –

+2

@EngieOP Это указатель на массив. Таким образом, вам нужна одна де-ссылка, чтобы перейти к массиву, на который она указывает, а другая - к элементу. Вы также можете сделать '(* Parr) [3]'. – juanchopanza

+0

Хорошо, теперь это намного больше. Благодарю. –

1

То, как мы можем иметь указатель на целое число или указатель на Фоишь, мы можем также иметь указатель на массив? Ответ «ДА». Дескрипция указателя на массив, однако немного неуклюжая.

Например, объявление int (* q) [4] означает, что q является указателем на массив из 4 целых чисел. в вашем коде

int (* parr) [10] означает, что parr является указателем на массив из 10 целых чисел.

, но int * parr = arr является только указателем на один элемент из arr [10].

Так что предположим, что вы оспатите любой указатель на arr [10]. во втором случае, выполняющем parr ++. Parr переместится в положение arr [10] form arr [0]. , но во втором случае, выполняющем parr ++. Parr переместится в положение arr [1] form arr [0].

Так что я надеюсь, что у вас есть ответ.

1

Первый - это указатель на int [10] '.

int (*Parr)[10] = &arr; // point to int array 

*Parr; // *Parr == arr 
**Parr; // **Parr == *(arr) == arr[0] 

Второй один является 'указатель на Int'

int *Parr = arr;   // point to the start of array 
*Parr; // *Parr == *(arr) == arr[0] 
Смежные вопросы