#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
распадается на тип указателя в выражении.