C ++ Многомерный массив и брекетинг имен указателей - PullRequest
2 голосов
/ 04 декабря 2011

Было уже задано много вопросов о многомерных массивах C ++, хотя ни один из них не дал ни A) полного объяснения того, что я пытаюсь задать здесь, ни B) Возможно, я просто не понял этого.

Моя проблема:

int (*ip)[4];

У меня проблема с пониманием причины добавления скобок вокруг * ip в этой ситуации. Глядя на многомерные массивы:

int ia[3][4];
int *ip = &ia[2];
int *ip2[4] = &ia[2];
int (*ip3)[4] = &ia[2];

ip, ip2 и ip3 - все , предназначенные для указания на первый элемент массива в позиции ia [2].

  1. ia [2] это просто указатель на первый элемент этого массива, и поэтому & ia [2] это адрес этого указателя? Правильно?
  2. Мне кажется, можно использовать ip , поскольку он будет работать так же, как будет работать char * ... да? нет
  3. мне имеет смысл, что ip2 неверен. Для меня имеет смысл, что ip2 - это массив указателей, которые указывают на целочисленные значения, когда я хочу указатель на массив целых чисел.
  4. Я знаю, IP3 правильно. Зачем? Потому что в книге так сказано. Это действительно так. Я не понимаю значение брекетинга.

Так как скобки меняют вещи? Я действительно после концептуального объяснения здесь, чтобы я мог понять и использовать эту концепцию в будущем.

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

Ответы [ 2 ]

3 голосов
/ 04 декабря 2011
  1. Первый:

    int *ip = &ia[2];
    

    недействителен.&ia[2] - это адрес int[4], поэтому он имеет тип int (*)[4] и поэтому не может использоваться для инициализации int *.Однако вы могли бы написать это:

    int *ip = ia[2];
    

    , что теперь делает то, что вы ожидаете.

  2. Нет, см. Выше.

  3. Действительно.

  4. Это правильно, потому что это правильный синтаксис.Начните с середины и работайте наружу.(*ip3) означает, что ip3 - указатель на что-то.Работая вовне, вещь, на которую он указывает, это int[4].

0 голосов
/ 04 декабря 2011

Скобки должны указывать, кто является указателем.

int *ip1[4];
int (*ip2)[4];

ip1 - это массив из 4 указателей на int.
ip2 - указатель на массив 4 int с.

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