Границы массива и индексы - PullRequest
0 голосов
/ 12 февраля 2010

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

Если я объявлю массив от 0 до 30 с

#define ENDPOINT 15
int record[2 * ENDPOINT + 1];
// and want a pointer to be at the middle of the array, so 0 is at the middle, and
// +15 is at 30, and -15 is at 0
// why is int *ptr = &record[ENDPOINT + 1] wrong?  why is the correct declaration
int *ptr = &record[ENDPOINT];

Потому что, если я поставлю ptr в & record [ENDPOINT], это будет означать 15-ю запись в массиве записей, которая является 14-м индексом, а затем добавление 15 будет только 29, верно? Спасибо!

Ответы [ 7 ]

6 голосов
/ 12 февраля 2010

record[ENDPOINT] - 16-й элемент - индексы массива начинаются с 0, поэтому record[0] - 1-й элемент, record[1] - 2-й элемент ... и record[ENDPOINT] (is record[15]) - 16-й элемент.

В вашем массиве 2*15+1 или 31 элемент. Добавление 14 к ENDPOINT (15) приводит к 29, а record[29] является 30-м элементом в массиве. record[30] будет последним или 31-м элементом в массиве.

2 голосов
/ 12 февраля 2010

Индексы массива начинаются с нуля, поэтому record[ENDPOINT] - это 15-й индекс, который является 16-й записью в массиве. Набор [0, 15] (включительно) содержит 16 номеров.

2 голосов
/ 12 февраля 2010

Потому что, если я помещу ptr в & record [ENDPOINT], это означает 15-ю запись в массиве записей, которая является 14-м индексом

Нет.

Это означает запись в record[15] - другими словами, 15-й индекс.

1 голос
/ 12 февраля 2010

мой ответ не отвечает на ваш вопрос; скорее я хочу добавить лучшую практику. если вы возитесь с индексами массивов, и вы действительно не уверены на 100%, правильно ли вы это понимаете и используете VC ++ 2008 или более позднюю версию, скомпилируйте код с помощью / RTC1, который выполнит проверки во время выполнения, чтобы сделать уверен, что вы правильно обращаетесь к границам массива.

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

это спасатель. поверь мне!

1 голос
/ 12 февраля 2010

Нет, &record[ENDPOINT] означает 16-ую запись, потому что &record[0] - первая, &record[1] - вторая и т. Д.

1 голос
/ 12 февраля 2010

В основном, если вы хотите указать точную середину, на которую хотите указать элемент, на который нужно указать - это +1 в определении.

Вот картинка:

123456789012345 x 543210987654321

Поскольку массивы основаны на 0, а не на 1, у вас есть:

012345678901234 x-1 432109876543210

0 голосов
/ 12 февраля 2010

Нет записи [30] означает ровно 30 записей, начиная с 0

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