Что возвращает

#c #arrays

#c #массивы

Вопрос:

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

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

Комментарии:

1. Языковой тег отсутствует. Это C? C ? PHP? …

2. Мне любопытно, как это отличается в C и C ..

3. amp;arr ничего не «возвращает». Это не функция.

4. @Siddhartha: это одно и то же в обоих случаях.

5. @Siddhartha: это одно и то же как в C, так и в C .

Ответ №1:

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

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

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

Ответ №2:

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

 int a;
a = 5;
  

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

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

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

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

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

Чтобы ответить на ваш другой вопрос amp;array — это просто еще один адрес памяти, посмотрите, помогает ли этот фрагмент кода прояснить, на что он указывает 🙂

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

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

int main(void) {
    printf("amp;array[2] is: %pn", amp;array[2]);
    printf("amp;array[0] is: %pn", amp;array[0]);
    printf("amp;array is: pn", amp;array);
    exit(0);
}

% gcc test.c
% ./a.out
amp;array[2] is: 0x100001088
amp;array[0] is: 0x100001080
amp;array is:    0x100001080
  

Комментарии:

1. Ааааа, мне всегда было интересно, что такое lvalue … Я всегда получаю ошибку «недопустимое присвоение значения lvalue», когда я использовал ‘=’ вместо ‘==’ .. теперь это имеет смысл. Я знал, что все происходит в памяти.. Хммм, я не был уверен, что amp;array действительно будет допустимым адресом памяти, но я вставил это в codepad.org и ты прав. Я предполагаю, что amp;array == amp;array[0] Кроме того, я предполагаю, что %p дает значение lvalue ? если да, то что делает p ? Спасибо за тонну: D

2. %p — это спецификатор формата, который используется при печати адреса памяти с помощью функции printf . Число 14 указывает printf дополнять вывод, пока он не станет шириной не менее 14 символов; извлеките его и посмотрите разницу в выводе. Я предполагаю, что вы читаете книгу по языку программирования C, и в нескольких главах вы встретите информацию о взаимосвязи между указателями и массивами. Как только вы прочитаете, что остальные комментарии с других плакатов могут иметь больше смысла. Кроме того, я настоятельно рекомендую вам прочитать этот документ от Теда Дженсена, он многое прояснит: mkurl.us/2YW

Ответ №3:

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

На языке, основанном на C amp;arr[0] , является указателем на первый элемент в массиве, в то время amp;arr[2] как является указателем на третий элемент в массиве. Массивы распадаются на указатели на первый элемент, поэтому в определенном контексте array и amp;arr[0] на самом деле являются одним и тем же: указателем на первый элемент.

Комментарии:

1. Я думал, что просто ‘arr’ сделал это?

2. @Siddhartha: arr распадается до указателя на первый элемент в массиве.

Ответ №4:

 amp;arr[0] == arr   0
amp;arr[1] == arr   1
amp;arr[2] == arr   2
  

и так далее.

Ответ №5:

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