2017-01-19 4 views
0

* отредактирован, чтобы уточнить, что массив неизвестноКак получить адрес элементов массива, заданный адресом самого массива в C?

Если адрес неизвестного целого массива 0x00006ffd29c78e70 (и целое 4 байта), что адрес элемента массива [1]?

Большое спасибо заранее.

+2

'& A [ 1] '? Или что конкретно неясно? – UnholySheep

+1

Данные 'T arr [N];' 'arr + i' или' & arr [i] '- адрес i-го элемента. – DeiDei

+0

@ UnholySheep, извините, должно быть, было яснее; должен иметь указанный неизвестный массив !, отредактирует его. – AAAgradebeef

ответ

1

Если 0x00006ffd29c78e70 это адрес действительного массива int с, то вы можете назначить его на указатель:

int *p = (int*)0x00006ffd29c78e70; 

тогда p[1] даст вам следующий элемент (второй) в этом массиве.

3

Адрес массива также является адресом его первого элемента. Это связано с тем, что сам массив в памяти состоит только из каждого из его элементов (начиная с индекса 0) по очереди. Поэтому, если A является массивом, &A[0] указывает на ту же память, что и A. (Обратите внимание, что существует техническая разница между массивом типов целых чисел и указателем на целочисленный тип, хотя они во многих случаях взаимозаменяемы, поскольку предыдущие распаковываются в последнее при определенных обстоятельствах, которые выходят за рамки этого вопроса, это почему я описал их как указывающие на одну и ту же память).

Вы спрашивали о первом элементе, а затем ссылались на A[1]. Обратите внимание, что A[1] является вторым элементом. A[0] - первый элемент.

Так что в вашем конкретном примере, вы могли бы сделать:

int *A = (int *)0x00006ffd29c78e70; 
int *A1 = &A[1]; // points to second element 
int foo = *A1; // second element contents 

или с использованием арифметики указателей

int *A = (int *)0x00006ffd29c78e70; 
int *A1 = A+1; // points to second element 
int foo = *A1; // second element contents 

Обратите внимание на +1 не добавит к (байт) адрес, но увеличивает значение указателя по одному int.

Примечание. Я написал int выше - используйте правильный целочисленный тип данных для представления вашего 4-байтового целого.

+0

Обратите внимание, что ** типы ** «адреса массива» и «адрес первого элемента» ** различаются **. – pmg

+0

Это второй элемент! – AAAgradebeef

+0

@AAAgradebeef Я знаю - см. Выше. На каком-то этапе я уверен, что вопрос задан о первом элементе. Но я уточнил. – abligh

0

элементы находятся в

unsigned char *addressofarray = whatever; 
unsigned char *secondelement = addressofarray + sizeof arrayelement; 
unsigned char *nthelement = addressofarray + n * sizeof arrayelement; 
+0

Содержимое представляет собой целые числа, а не' unsigned char * '(предположительно - он говорит 4 байта) – abligh

0

вы только что получили указатель на Асесс любую вещь в массиве как:

int *ptr = (int*) 0x00006ffd29c78e70;   

вы можете Асесс любой элемент, как:

*(ptr+i) //i is the index