C увеличить адрес массива int? - PullRequest
0 голосов
/ 04 мая 2018

Итак, у меня есть следующий массив из 8 элементов:

int v[8] = {0, 1, 2, 3, 4, 5, 6, 7};

и я передаю этот массив функции в качестве аргумента в цикле

while(i < N) {
    .
    .
    function(v);
    .
    .
}

В этой функции я работаю с первыми 4 элементами, а в следующем цикле я хочу увеличить адрес массива на 4 позиции, чтобы я мог работать с последними 4 элементами. Поскольку int составляет 4 байта, я думал что-то вроде:

while(i < N) {
    .
    .
    function(v);
    .
    *v += 16;
}

Однако, это не то, что я ожидал.

Примечание: Я не могу использовать malloc, так как работаю над встроенной системой. Я считаю, что мой массив должен быть объявлен так, как я считаю.

ВОПРОС (отредактированный):

Как я могу увеличить адрес моего массива, чтобы на второй итерации v указывал на v [4]?

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Массив не является указателем , поэтому v не является указателем - это массив, состоящий из элементов. Вы не можете изменить местоположение в памяти любого объекта в C.

Когда вы просто пишете v, оценивает указатель на первый элемент. Итак, решение простое, присвойте его фактическому указателю, который вы можете изменить:

int *p = v;
p += 3;
0 голосов
/ 04 мая 2018

В этом случае вы хотите использовать указатель на ваш массив.

Если вы делаете

int *p = v;

и затем в вашем цикле вызова

function(p);

, а затем сделать

p += 4;

и затем во время следующей поездки через ваш цикл

function(p);

снова, он будет делать то, что вы хотите.

Как и любая переменная, если массиву присвоен свой адрес, его невозможно переместить. Так что нет способа «увеличить адрес массива». Но создавая вторую переменную-указатель, легко перемещать ее в массиве. (Но если вам нравится думать об этом таким образом, да, вы увеличиваете адрес, содержащийся в указателе.)

Вам не нужно беспокоиться о том, насколько большие целые числа (то есть вы не должны говорить что-то вроде p += 4 * 4 или p += 4 * sizeof(int)), потому что арифметика указателей в C определяется как всегда работает на объектах, на которые указывают. (То есть компилятор автоматически заботится о умножении на размер указываемого объекта).

...