Что в массиве возвращает & arr [2]? - PullRequest
1 голос
/ 14 октября 2011

Если у нас есть массив [5], мы знаем, что arr == & arr [0], но что такое & arr [2] =?

Кроме того, что нам возвращает & arr?

Ответы [ 5 ]

2 голосов
/ 14 октября 2011

Давайте сначала рассмотрим простой пример:

int a;
a = 5;

В некотором смысле целое число a имеет два значения, связанных с ним.Первое, о чем вы, скорее всего, думаете в первую очередь, это rvalue, которое в данном случае является числом 5. Существует также то, что называется lvalue (произносится как «значение el»), то есть адрес памяти - целое число a находится по адресу.

Это важная концепция для понимания.В конце концов, все дело в памяти.Мы храним код и переменные в памяти.Процессор выполняет инструкции, которые находятся в памяти, и выполняет действия с данными, которые также находятся в памяти.Это всего лишь память.Ничего очень сложного;если кто-то пытается напугать вас указателями, не слушайте, это всего лишь память:)

Отлично, в случае массива мы имеем дело с непрерывным блоком памяти, который используется для хранения данныхтот же тип:

int array[] = {0, 1, 1, 2, 3, 5, 8, 13, 21};

Как вы уже отметили, имя массива относится к ячейке памяти первого элемента в массиве (например, array == & array [0]).Так что в моем примере массив выше & array [2] будет ссылаться на область памяти (или lvalue), которая содержит третий элемент в массиве.

Чтобы ответить на ваш другой вопрос, массив - это просто еще один адрес памяти, посмотрите, если этофрагмент кода помогает понять, на что он указывает:)

#include <stdio.h>
#include <stdlib.h>

int array[] = {0, 1, 1, 2, 3, 5, 8, 13, 21};

int main(void) {
    printf("&array[2] is: %p\n", &array[2]);
    printf("&array[0] is: %p\n", &array[0]);
    printf("&array is: %14p\n", &array);
    exit(0);
}

% gcc test.c
% ./a.out
&array[2] is: 0x100001088
&array[0] is: 0x100001080
&array is:    0x100001080
2 голосов
/ 14 октября 2011

Если у нас есть массив [5], мы знаем, что arr = & arr [0], но что такое & arr [2] =?

В языке Си &arr[0] - указатель на первый элемент в массиве, а &arr[2] - указатель на третий элемент в массиве. Массивы распадаются на указатели на первый элемент, поэтому в определенном контексте array и &arr[0] фактически одно и то же: указатель на первый элемент.

1 голос
/ 14 октября 2011

В c единственная разница между оператором [] и оператором + заключается в том, что оператор [] также разыменовывает указатель. Это означает, что arr[2] == *(arr + 2) и &arr[2] == &(*(arr + 2)) == arr + 2.

С другой стороны, это также означает забавное взаимодействие, в котором вы ссылаетесь на индексы массива, такие как index[array]: то есть arr[2] == 2[arr].

Чем больше ты знаешь ....

1 голос
/ 14 октября 2011

В C и C ++, если T является фундаментальным типом и у вас есть массив T array[N], тогда array[i] равен *(array+i), используя тот факт, что выражение array распадается на тип указателяв выражении.

1 голос
/ 14 октября 2011
&arr[0] == arr + 0
&arr[1] == arr + 1
&arr[2] == arr + 2

и т. Д.

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