Почему первый элемент массива равен массиву? .Допустим, у вас есть целочисленный массив типа int arr[5];
, тогда в соответствии с вашим вопросом заголовок
- первый элемент массива будет
arr[0]
, что является значением arr[0]
, и - массив означает
arr
и arr
имена представляют базовый адрес массива.Так что arr
и arr[0]
не одно и то же.arr
является базовым адресом, а arr[0]
является значением.
В вашем конкретном случае массив целых чисел a
выглядит следующим образом, и все элементы массива хранятся в последовательной ячейке памяти.Предположим, что базовый адрес массива равен 0x100
(некоторая ячейка памяти)
a[0] a[1] a[2] a[3] ........................................ a[9]
------------------------------------------------------------------------
| 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 | 20 | 22 |
------------------------------------------------------------------------
0x100 0x104 0x108 .. ..
a
LSB MSB
Так что здесь a
означает 0x100
, предполагая, что базовый адрес a
равен 0x100
.Теперь, когда вы делаете
p = &a[0]; /* here you are setting p to point to one of the places in the array a and that is a[0] */
, здесь p
указывает на first
элемент a
, то есть 0x100
, как показано ниже
a[0] a[1] a[2] a[3] ........................................ a[9]
------------------------------------------------------------------------
| 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 | 20 | 22 |
------------------------------------------------------------------------
0x100 0x104 0x108 0x112 0x116.. ..
a
|
p
Теперь, когда вы печатаете a[4]
он печатает 10
, что довольно просто, как и ожидалось, и расширяется, как показано ниже
a[4] = *(a + 4) /* here you can say that array name a is converted to a pointer to its first element */
= *(0x100 + 4*4 ) /* multiplied by 4 ? bcz a is int array & each element size is 4 byte */
= *(0x116) /* value at 0x116 memory location */
= 10
А когда вы печатаете p[4]
, он расширяется, как показано ниже
p[4] = *(p + 4)
= *(0x100 + 4*4) /*multiplied by 4 because int pointer increments by 4 bytes*/
= *(0x116) ? /* it prints value at 0x116 location which 10 */
= 10
Также при назначении значений дляэлементы массива в for loop
, вы пытаетесь получить доступ к a[10]
, который выходит за границы и вызывает неопределенное поведение .В приведенном ниже кодовом блоке условие должно быть i<10
вместо i<=10
, как вы объявили a[10]
, а индекс массива начинается с zero
.
for(i = 0;i <=10;i++) { /* make it i<10 */
a[i] = (i + 1) * 2;
}
Наконец, void main() { /* code */ }
- это плохая практика, и этоне соответствует спецификации стандартов C.Вместо этого используйте int main(void) { }
, как указано в стандарте C n1256
draft.
5.1.2.2.1 Запуск программы
1 Функция, вызываемая при запуске программы, называется main.Реализация не объявляет прототип для этой функции.Он должен быть определен с типом возврата int и без параметров:
int main(void) { /* ... */ }
или с двумя параметрами (именуемыми здесь как argc и argv, хотя могут использоваться любые имена,поскольку они локальны для функции, в которой они объявлены):
int main(int argc, char *argv[]) { /* ... */ }
или эквивалентной; 9) или каким-либо другим способом, определяемым реализацией.