Назначение ссылок на массивы указателей - PullRequest
1 голос
/ 04 апреля 2020

У меня возникла следующая проблема с пониманием синтаксиса C / C ++. Предположим, у нас есть следующие данные:

int a[3] = {1,3,5};
int b[3] = {2,4,6};
int* p[2];

Я создал массив p, содержащий два указателя.

Первый вопрос : почему не работает следующее присвоение:

p[0] = &a; p[1] = &b;

Поскольку указатели принимают адреса в качестве своих значений. По какой-то причине p[0] = a; p[1] = b; работает, хотя.

Второй вопрос: , поскольку p [0] теперь указывает на a, почему *(*(p[0]))[0] не работает? Как получить значение из указателя, ссылающегося на некоторый индекс?

Справочная информация: У меня возникли эти проблемы, поскольку я пытаюсь естественным образом расширить синтаксис со скалярами на массивы, где будет работать следующий синтаксис:

  double a = 3;
  double* p = &a;

и * p дает значение, тогда как p дает адрес.

Ответы [ 3 ]

3 голосов
/ 04 апреля 2020

Существуют разные типы указателей. &a - указатель на массив 3 int с. p[0] - указатель на один int. Они не совместимы. Между тем, массив может распадаться на указатель на первый элемент, поэтому p[0] = a указывает p[0] на первый элемент a. Вы можете получить доступ к элементам в a, применив смещение к указателю на первый элемент, используя *(p[0] + i), что эквивалентно p[0][i].

2 голосов
/ 04 апреля 2020

Первый вопрос: почему не работает следующее присваивание:

p[0] = &a; p[1] = &b;

Вы используете одну переменную int* из массива указателей, что вы ожидаете, что она будет указывать к? Адрес массива в целом или конкретного элемента? Конечно, единственное значение, для которого p[index] может быть назначено только одной переменной, например, a[index] в вашем случае. Например, это будет работать:

p[0] = &a[0];
// cout<<*p[0]; would yield a[0] or 1.

Второй вопрос: поскольку p [0] теперь указывает на a, почему не работает *(*(p[0]))[0]? Как я должен получить значение из указателя, ссылающегося на некоторый индекс?

Вы разыменовываете указатель (должен был вернуться обратно с &). Используйте p[0][index] для ссылки a на требуемый индекс.

1 голос
/ 04 апреля 2020

Массив a, когда используется в этом контексте, ведет себя так, как если бы он был указателем на свой первый элемент массива.

Таким образом, голый a ведет себя как & a [0]

, тогда как & a is адрес локальной переменной массива. Так & & является адресом массива.

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