Массив и указатели - PullRequest
       1

Массив и указатели

3 голосов
/ 18 ноября 2011
int array[10] = {1,2,3,4,5,6,7,8};
int *ptr = array;
std::cout<<*(ptr+ 2); => O/P = 3

int (*arr_ptr)[10] = &array;
std::cout<<*(*arr_ptr+2); => O/P = 3

В чем разница между этими 2. Я знаю, что они имеют в виду, но если они дают одинаковый результат, почему у нас есть 2 разных обозначения?

Ответы [ 4 ]

3 голосов
/ 18 ноября 2011

Первый случай - это обычный случай: ptr - указатель на первый элемент массива array, и он индексируется (используя *(ptr+2), который является синонимом для ptr[2]) для доступа ктретий элемент этого массива.

Второй случай придуман: arr_ptr - указатель на массив (enitre) array.Сначала разыменовывается (с *arr_ptr) для получения самого массива, который затем используется в качестве аргумента для двоичного +, что приводит к неявному преобразованию его в (безымянный) указатель на его первый элемент, который затеминдексируется таким же образом *(<nameless pointer>+2) и дает тот же результат.

Сделав эти неявные преобразования явными, вы могли бы написать

int *ptr = &array[0];
std::cout<<*(ptr+ 2);

int (*arr_ptr)[10] = &array;
std::cout<<*( &(*arr_ptr)[0] + 2 );
1 голос
/ 18 ноября 2011

После редактирования вашего вопроса, следующие различия:

(1) int *ptr = array;

array исчезает в указателе.ptr в идеале разрешено указывать на любой int[] независимо от его размера

(2) int (*arr_ptr)[10] = &array;

arr_ptr - указатель на int[10].Это очень конкретное определение, и вы никогда не сможете присвоить массиву arr_ptr, размер которого отличается от 10.

int array_2[20];
arr_ptr = &array_2; // error
0 голосов
/ 18 ноября 2011

Они на самом деле не совпадают с компилятором и приведут к созданию другого языка ассемблера.

Вот хорошая справка о разнице: http://cplusplus.com/forum/articles/10/

0 голосов
/ 18 ноября 2011

Используйте обозначения, которые вы понимаете и которые соответствуют проблемной области.Если ваше приложение имеет массив, используйте нотацию массива.Если по какой-то другой причине вам нужно перемещать указатели, тогда подходит вторая версия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...