Каков метод переназначения точки данных в массиве int в c ++ с использованием указателей - PullRequest
0 голосов
/ 06 апреля 2020

для моего класса я должен продемонстрировать манипулирование массивом с помощью указателей. Первая часть заключалась в выводе значения с использованием указателей, которые я уже сделал. Вторая часть - та, с которой мне нужна помощь. С данным кодом я должен вывести ar [0] [3], используя указатель p. Я не прошу ответа, я просто хочу знать, как это сделать. Кроме того, я не знаю, почему указатель p и q инициализируются по адресу 9, когда я запускаю программу. Это просто побочный вопрос. Вот данный код.

int ar[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12};
int **p;

int *q;

p=&q;

q =*(ar+2);

Пишите, используя указатель arithmeti c, как бы изменить значение ar [0] [3], используя указатель стр.

Я также отправлю электронное письмо своему учителю, чтобы спросить, но это вряд ли он ответит сегодня, поэтому я и спрашиваю вас, ребята. Заранее спасибо.

Ответы [ 3 ]

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

как бы изменить значение ar [0] [3] с помощью указателя стр.

Сначала присвойте q, чтобы указать ar[0][3]. Неясно, применимо ли к этому произвольное требование использовать p, но давайте предположим, что q необходимо изменить, указав через p:

*p = &ar[0][3];

Затем косвенно через q для доступа элемент и измените значение, присвоив его:

**p = new_value;

есть ли причина, по которой я не могу просто использовать *p = new_value?

p указатель на целое число Когда вы косвенно через p, вы получите указатель на целое число, на которое указывает. Вы не можете присвоить целочисленное значение «указателю на целое число». Вы должны косвенно через "указатель на целое число", чтобы получить доступ к указанному целому числу. Итак, сначала косвенно через указатель на указатель на целое число, чтобы получить указатель на целое число, затем косвенно через указатель на целое число, чтобы получить целое число, значение которого вы можете назначить. Т.е. **p = new_value;

или будет [*p = new_value] просто перезаписывать *p?

Да. Присвоение объекту перезаписывает значение объекта. В этом случае назначенным объектом является указатель q.

0 голосов
/ 06 апреля 2020

Я считаю, что проще рассуждать о массивах, если вы не пытаетесь думать о 2D-массиве как о чем-то особенном. Это не так. Это просто массив массивов.

int **p - неправильный тип для использования. Массив массивов int не может быть преобразован в указатель на указатель на int.

. Массив может превратиться в указатель на свой первый элемент. Так какой тип первого элемента массива из 3 массивов по 4 int с? Это массив 4 int с. Это означает, что тип, в который распадется int[3][4], не int**, это int (*)[4]: указатель на массив из 4 int с.

int ar[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
// ar decays to a pointer to its first element, which is an array of 4 ints,
// so p is a pointer to an array of 4 ints, pointing to the first element of ar
int (*p)[4] = ar;
// You can then dereference p, yielding an array of 4 ints.
// That array decays to a pointer to its first element, which is an int,
// so q is a pointer to an int, pointing to the first element of the first element
// of ar
int *q = *p;
// To get the 3rd element of the first element of ar, shift q 2 positions and then
// dereference the resulting pointer
std::cout << *(q + 2);  // output the desired element

Live Демо


Конечно, вам не нужно промежуточные переменные p и q. Вы можете просто сделать все в одной строке:

int ar[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
// 1. ar decays to a pointer to its first element
// 2. Dereference the pointer that ar decayed into
// 3. The array yielded by the dereference in (2) decays into a pointer to
//    its first element
// 4. Offset the pointer that results from (3) by two positions
// 5. Dereference the pointer from (4) to access the third element of the
//    first element of ar
std::cout << *(*ar + 2);

Live Demo

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

0 голосов
/ 06 апреля 2020

Итак, вы выяснили, как манипулировать одномерным массивом с помощью указателей. Это легко, поскольку массив можно просто рассматривать как указатель, а число в квадратных скобках - просто способ увеличить указатель arr [i] эквивалентно * (arr + i). Аналогичный подход может быть применен для двумерного массива, для массива arr [i] [j], мы сначала разыменовываем arr + i, чтобы получить новый массив, содержащий j членов, затем снимаем ссылку * (arr + i) + j, чтобы окончательно получить ( (arr + i) + j), код должен выглядеть примерно так:

#include <iostream>
using namespace std;
int main()
{
    int arr[3][3] = {1,2,3,
                     4,5,6,
                     7,8,9};
    int i=1,j=2;
    cout << *(*(arr+i)+j);
}

Итак, еще один пример, если у нас есть 3- размерный массив arr [a] [b] [c], чтобы извлечь элемент с помощью указателей, мы можем сделать это так:

*(*(*(arr+a)+b)+c)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...