Базовая арифметика с указателями, которая поставила меня в тупик - PullRequest
0 голосов
/ 03 апреля 2012

Я работаю над проблемой, которая использует арифметику указателей, и я нашел этот небольшой фрагмент кода, который работает.Я точно не понимаю, что он делает.Для меня это выглядит как назначение адреса буфера + значение ix3 элементу массива a [i].Я не знаю, почему это будет иметь отношение к моей программе, хотя.Может кто-нибудь сказать, пожалуйста, что конкретно происходит в этом цикле?

int *buffer=new int[5*3];

for (i=0;i<5;i++)
    a[i] = buffer+i*3;

Ответы [ 3 ]

2 голосов
/ 03 апреля 2012

Это именно то, что вы сказали. Массив a (чье определение вы не показывали), вероятно, имеет тип int* [5].

Цель этого состоит в том, чтобы включить нормальное двойное индексирование (т.е. без постоянной арифметики индекса). Чтобы увидеть это, подумайте, что произойдет, если вы получите доступ к a[1][2] После вышеприведенного цикла a[1] содержит значение buffer + 3, т.е. оно указывает на четвертый элемент buffer (добавление n к указателю перемещает указатель n элементов вперед). Таким образом, a[1][2] - это то же самое, что и (buffer+3)[2], который обращается к значению, которое на два элемента дальше, чем *, куда указывает buffer+3, другими словами, оно эквивалентно buffer[5].

В целом, после этой инициализации a[i][k] получает доступ к тому же элементу, что и buffer[3*i+k] (ну, если, конечно, i больше 4, конечно).

2 голосов
/ 03 апреля 2012

Выражение

buffer+i*3

идентично

&buffer[i*3]

так что ваше предположение верно, и я надеюсь, что a[] - это массив указателей.

Обратите внимание, что арифметика указателя, такая как buffer+k, не не принимает значение адреса, содержащееся в buffer, и добавляет к нему k: вместо этого оно равно значению &buffer[k], которое должно равняться значение адреса, содержащееся в буфере + k * sizeof (тип, на который указывает буфер).

0 голосов
/ 03 апреля 2012

buffer+i*3; - это просто окольный способ сделать &buffer[i*3];.

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