#include <stdio.h>
int main( void )
{
// arr - массив из 3 int.
int arr[ ] = { 10 , 20 , 30 } ;
// arrptr - указатель на массив неопределенного количества int.
int ( * arrptr) [ ] = & arr;
// intptr - указатель на первый элемент массива. & не нужен, потому что
// см. парой строк ниже.
int * intptr = arr;
// 1. При использовании имени массива, оно всегда неявно кастится
// к указателю на тип его элементов, если это имя не является операндом
// для & или sizeof. Тут arr кастится к int *, но это отнюдь не означает,
// что arr является int *.
// Мы делаем каст аргумента в void *, чтобы осчастливить компилятор.
// Это требуется лишь для %p по стандарту, но в обычном мире на
// существующих машинах он совершенно ничего не делает со
// значением указателя).
printf ( "Address of the first element " "(using imlicit cast of arr): %p\n " , ( void * ) arr) ;
// 2. Тут все просто? Хуй там. Тут arr кастится к int *, потом [0] делает
// адресную арифметику (address + sizeof(int) * 0), но так как слева &
// то дереференса не происходит.
printf ( "Address of the first element " "(using &arr[0]): %p\n " , ( void * ) & arr[ 0 ] ) ;
// 3. Адрес массива в виде указателя на массив численно равен указателю
// на первый элемент.
printf ( "Address of arr using & directly (&arr): %p and from arrptr value: %p\n " , ( void * ) & arr, ( void * ) arrptr) ;
// Раз адрес массива совпадает с адресом его первого элемента, то
// дереференс указателя на массив не поменяет численное значение
// этого указателя (на нормальных машинах), а поменяет только его
// тип.
printf ( "Dereferencing pointer to an array = %p changes its type\n " "\t but not its value: %p\n " , ( void * ) & arr, ( void * ) * ( & arr) ) ;
// Читаем через указатель на int, скучно.
printf ( "Dereferencing intptr (int *): %d\n " , * ( intptr
) ) ;
// См. (1), плюс дереференс.
printf ( "Dereferencing arr implicitly casted to (int *): %d\n " , * arr
) ;
// См. (2), но [] делает дереференс. Т.е, *((int *) (arr)) + 0).
printf ( "Using [] sugar on arr: %d\n " , arr
[ 0 ] ) ;
// Опять первый дереференс указателя на массив меняет его тип с
// "указателя на массив int" на "указатель на int", а второй уже
// явно (*) или неявно ([]) дереференсит и читает значение.
printf ( "Dereferencing &arr twice: %d\n " , * ( * ( & arr
) ) ) ; printf ( "Dereferencing arrptr twice: %d\n " , ( * arrptr
) [ 0 ] ) ;
// Все вышесказанное справедливо для обычных машин и обычного кода.
// В теории может существовать компилятор, соблюдающий стандарт, у
// которого указатели различных типов не будут равны, у которого явно
// взятый указатель на массив не будет совпадать с указателем на первый
///элемент. Т.е., хотя так никто не делает (потом что не нужно), но
// компилятор, у которого вот такое поведение, вполне нормален:
// (uintptr_t) (&arr) != (uintptr_t) (&arr[0])
// но при этом неявный каст по стандарту обязан работать везде:
// (uintptr_t) (arr) == (uintptr_t) (&arr[0])
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgppbnQgbWFpbih2b2lkKQp7CiAgICAvLyBhcnIgLSDQvNCw0YHRgdC40LIg0LjQtyAzIGludC4KICAgIGludCBhcnJbXSA9IHsgMTAsIDIwLCAzMCB9OwogICAgCiAgICAvLyBhcnJwdHIgLSDRg9C60LDQt9Cw0YLQtdC70Ywg0L3QsCDQvNCw0YHRgdC40LIg0L3QtdC+0L/RgNC10LTQtdC70LXQvdC90L7Qs9C+INC60L7Qu9C40YfQtdGB0YLQstCwIGludC4KICAgIGludCAoKmFycnB0cilbXSA9ICZhcnI7CiAgICAKICAgIC8vIGludHB0ciAtINGD0LrQsNC30LDRgtC10LvRjCDQvdCwINC/0LXRgNCy0YvQuSDRjdC70LXQvNC10L3RgiDQvNCw0YHRgdC40LLQsC4gJiDQvdC1INC90YPQttC10L0sINC/0L7RgtC+0LzRgyDRh9GC0L4KICAgIC8vINGB0LwuINC/0LDRgNC+0Lkg0YHRgtGA0L7QuiDQvdC40LbQtS4KICAgIGludCAqaW50cHRyID0gYXJyOwogICAgCiAgICAvLyAxLiDQn9GA0Lgg0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40Lgg0LjQvNC10L3QuCDQvNCw0YHRgdC40LLQsCwg0L7QvdC+INCy0YHQtdCz0LTQsCDQvdC10Y/QstC90L4g0LrQsNGB0YLQuNGC0YHRjwogICAgLy8g0Log0YPQutCw0LfQsNGC0LXQu9GOINC90LAg0YLQuNC/INC10LPQviDRjdC70LXQvNC10L3RgtC+0LIsINC10YHQu9C4INGN0YLQviDQuNC80Y8g0L3QtSDRj9Cy0LvRj9C10YLRgdGPINC+0L/QtdGA0LDQvdC00L7QvAogICAgLy8g0LTQu9GPICYg0LjQu9C4IHNpemVvZi4g0KLRg9GCIGFyciDQutCw0YHRgtC40YLRgdGPINC6IGludCAqLCDQvdC+INGN0YLQviDQvtGC0L3RjtC00Ywg0L3QtSDQvtC30L3QsNGH0LDQtdGCLAogICAgLy8g0YfRgtC+IGFyciDRj9Cy0LvRj9C10YLRgdGPIGludCAqLgogICAgCiAgICAvLyDQnNGLINC00LXQu9Cw0LXQvCDQutCw0YHRgiDQsNGA0LPRg9C80LXQvdGC0LAg0LIgdm9pZCAqLCDRh9GC0L7QsdGLINC+0YHRh9Cw0YHRgtC70LjQstC40YLRjCDQutC+0LzQv9C40LvRj9GC0L7RgC4KICAgIC8vINCt0YLQviDRgtGA0LXQsdGD0LXRgtGB0Y8g0LvQuNGI0Ywg0LTQu9GPICVwINC/0L4g0YHRgtCw0L3QtNCw0YDRgtGDLCDQvdC+INCyINC+0LHRi9GH0L3QvtC8INC80LjRgNC1INC90LAKICAgIC8vINGB0YPRidC10YHRgtCy0YPRjtGJ0LjRhSDQvNCw0YjQuNC90LDRhSDQvtC9INGB0L7QstC10YDRiNC10L3QvdC+INC90LjRh9C10LPQviDQvdC1INC00LXQu9Cw0LXRgiDRgdC+CiAgICAvLyDQt9C90LDRh9C10L3QuNC10Lwg0YPQutCw0LfQsNGC0LXQu9GPKS4KICAgIHByaW50ZigiQWRkcmVzcyBvZiB0aGUgZmlyc3QgZWxlbWVudCAiCiAgICAgICAgIih1c2luZyBpbWxpY2l0IGNhc3Qgb2YgYXJyKTogJXBcbiIsICh2b2lkICopIGFycik7CiAgICAKICAgIC8vIDIuINCi0YPRgiDQstGB0LUg0L/RgNC+0YHRgtC+PyDQpdGD0Lkg0YLQsNC8LiDQotGD0YIgYXJyINC60LDRgdGC0LjRgtGB0Y8g0LogaW50ICosINC/0L7RgtC+0LwgWzBdINC00LXQu9Cw0LXRggogICAgLy8g0LDQtNGA0LXRgdC90YPRjiDQsNGA0LjRhNC80LXRgtC40LrRgyAoYWRkcmVzcyArIHNpemVvZihpbnQpICogMCksINC90L4g0YLQsNC6INC60LDQuiDRgdC70LXQstCwICYKICAgIC8vINGC0L4g0LTQtdGA0LXRhNC10YDQtdC90YHQsCDQvdC1INC/0YDQvtC40YHRhdC+0LTQuNGCLgogICAgcHJpbnRmKCJBZGRyZXNzIG9mIHRoZSBmaXJzdCBlbGVtZW50ICIKICAgICAgICAiKHVzaW5nICZhcnJbMF0pOiAlcFxuIiwgKHZvaWQgKikgJmFyclswXSk7CgogICAgLy8gMy4g0JDQtNGA0LXRgSDQvNCw0YHRgdC40LLQsCDQsiDQstC40LTQtSDRg9C60LDQt9Cw0YLQtdC70Y8g0L3QsCDQvNCw0YHRgdC40LIg0YfQuNGB0LvQtdC90L3QviDRgNCw0LLQtdC9INGD0LrQsNC30LDRgtC10LvRjgogICAgLy8g0L3QsCDQv9C10YDQstGL0Lkg0Y3Qu9C10LzQtdC90YIuCiAgICBwcmludGYoIkFkZHJlc3Mgb2YgYXJyIHVzaW5nICYgZGlyZWN0bHkgKCZhcnIpOiAlcCBhbmQgZnJvbSBhcnJwdHIgdmFsdWU6ICVwXG4iLAogICAgICAgICh2b2lkICopICZhcnIsICh2b2lkICopIGFycnB0cik7CiAgICAKICAgIC8vINCg0LDQtyDQsNC00YDQtdGBINC80LDRgdGB0LjQstCwINGB0L7QstC/0LDQtNCw0LXRgiDRgSDQsNC00YDQtdGB0L7QvCDQtdCz0L4g0L/QtdGA0LLQvtCz0L4g0Y3Qu9C10LzQtdC90YLQsCwg0YLQvgogICAgLy8g0LTQtdGA0LXRhNC10YDQtdC90YEg0YPQutCw0LfQsNGC0LXQu9GPINC90LAg0LzQsNGB0YHQuNCyINC90LUg0L/QvtC80LXQvdGP0LXRgiDRh9C40YHQu9C10L3QvdC+0LUg0LfQvdCw0YfQtdC90LjQtQogICAgLy8g0Y3RgtC+0LPQviDRg9C60LDQt9Cw0YLQtdC70Y8gKNC90LAg0L3QvtGA0LzQsNC70YzQvdGL0YUg0LzQsNGI0LjQvdCw0YUpLCDQsCDQv9C+0LzQtdC90Y/QtdGCINGC0L7Qu9GM0LrQviDQtdCz0L4KICAgIC8vINGC0LjQvy4KICAgIHByaW50ZigiRGVyZWZlcmVuY2luZyBwb2ludGVyIHRvIGFuIGFycmF5ID0gJXAgY2hhbmdlcyBpdHMgdHlwZVxuIgogICAgICAgICJcdGJ1dCBub3QgaXRzIHZhbHVlOiAlcFxuIiwgKHZvaWQgKikgJmFyciwgKHZvaWQgKikgKigmYXJyKSk7CiAgICAKICAgIC8vINCn0LjRgtCw0LXQvCDRh9C10YDQtdC3INGD0LrQsNC30LDRgtC10LvRjCDQvdCwIGludCwg0YHQutGD0YfQvdC+LgogICAgcHJpbnRmKCJEZXJlZmVyZW5jaW5nIGludHB0ciAoaW50ICopOiAlZFxuIiwgKihpbnRwdHIpKTsKICAgIAogICAgLy8g0KHQvC4gKDEpLCDQv9C70Y7RgSDQtNC10YDQtdGE0LXRgNC10L3RgS4KICAgIHByaW50ZigiRGVyZWZlcmVuY2luZyBhcnIgaW1wbGljaXRseSBjYXN0ZWQgdG8gKGludCAqKTogJWRcbiIsICphcnIpOwogICAgCiAgICAvLyDQodC8LiAoMiksINC90L4gW10g0LTQtdC70LDQtdGCINC00LXRgNC10YTQtdGA0LXQvdGBLiDQoi7QtSwgKigoaW50ICopIChhcnIpKSArIDApLgogICAgcHJpbnRmKCJVc2luZyBbXSBzdWdhciBvbiBhcnI6ICVkXG4iLCBhcnJbMF0pOwogICAgCiAgICAvLyDQntC/0Y/RgtGMINC/0LXRgNCy0YvQuSDQtNC10YDQtdGE0LXRgNC10L3RgSDRg9C60LDQt9Cw0YLQtdC70Y8g0L3QsCDQvNCw0YHRgdC40LIg0LzQtdC90Y/QtdGCINC10LPQviDRgtC40L8g0YEKICAgIC8vICLRg9C60LDQt9Cw0YLQtdC70Y8g0L3QsCDQvNCw0YHRgdC40LIgaW50IiDQvdCwICLRg9C60LDQt9Cw0YLQtdC70Ywg0L3QsCBpbnQiLCDQsCDQstGC0L7RgNC+0Lkg0YPQttC1CiAgICAvLyDRj9Cy0L3QviAoKikg0LjQu9C4INC90LXRj9Cy0L3QviAoW10pINC00LXRgNC10YTQtdGA0LXQvdGB0LjRgiDQuCDRh9C40YLQsNC10YIg0LfQvdCw0YfQtdC90LjQtS4KICAgIHByaW50ZigiRGVyZWZlcmVuY2luZyAmYXJyIHR3aWNlOiAlZFxuIiwgKigqKCZhcnIpKSk7CiAgICBwcmludGYoIkRlcmVmZXJlbmNpbmcgYXJycHRyIHR3aWNlOiAlZFxuIiwgKCphcnJwdHIpWzBdKTsKICAgIAogICAgLy8g0JLRgdC1INCy0YvRiNC10YHQutCw0LfQsNC90L3QvtC1INGB0L/RgNCw0LLQtdC00LvQuNCy0L4g0LTQu9GPINC+0LHRi9GH0L3Ri9GFINC80LDRiNC40L0g0Lgg0L7QsdGL0YfQvdC+0LPQviDQutC+0LTQsC4KICAgIC8vINCSINGC0LXQvtGA0LjQuCDQvNC+0LbQtdGCINGB0YPRidC10YHRgtCy0L7QstCw0YLRjCDQutC+0LzQv9C40LvRj9GC0L7RgCwg0YHQvtCx0LvRjtC00LDRjtGJ0LjQuSDRgdGC0LDQvdC00LDRgNGCLCDRgwogICAgLy8g0LrQvtGC0L7RgNC+0LPQviDRg9C60LDQt9Cw0YLQtdC70Lgg0YDQsNC30LvQuNGH0L3Ri9GFINGC0LjQv9C+0LIg0L3QtSDQsdGD0LTRg9GCINGA0LDQstC90YssINGDINC60L7RgtC+0YDQvtCz0L4g0Y/QstC90L4KICAgIC8vINCy0LfRj9GC0YvQuSDRg9C60LDQt9Cw0YLQtdC70Ywg0L3QsCDQvNCw0YHRgdC40LIg0L3QtSDQsdGD0LTQtdGCINGB0L7QstC/0LDQtNCw0YLRjCDRgSDRg9C60LDQt9Cw0YLQtdC70LXQvCDQvdCwINC/0LXRgNCy0YvQuQogICAgLy8v0Y3Qu9C10LzQtdC90YIuINCiLtC1Liwg0YXQvtGC0Y8g0YLQsNC6INC90LjQutGC0L4g0L3QtSDQtNC10LvQsNC10YIgKNC/0L7RgtC+0Lwg0YfRgtC+INC90LUg0L3Rg9C20L3QviksINC90L4KICAgIC8vINC60L7QvNC/0LjQu9GP0YLQvtGALCDRgyDQutC+0YLQvtGA0L7Qs9C+INCy0L7RgiDRgtCw0LrQvtC1INC/0L7QstC10LTQtdC90LjQtSwg0LLQv9C+0LvQvdC1INC90L7RgNC80LDQu9C10L06CiAgICAvLyAgICAgKHVpbnRwdHJfdCkgKCZhcnIpICE9ICh1aW50cHRyX3QpICgmYXJyWzBdKQogICAgLy8g0L3QviDQv9GA0Lgg0Y3RgtC+0Lwg0L3QtdGP0LLQvdGL0Lkg0LrQsNGB0YIg0L/QviDRgdGC0LDQvdC00LDRgNGC0YMg0L7QsdGP0LfQsNC9INGA0LDQsdC+0YLQsNGC0Ywg0LLQtdC30LTQtToKICAgIC8vICAgICAodWludHB0cl90KSAoYXJyKSA9PSAodWludHB0cl90KSAoJmFyclswXSkKfQo=