Другие языки программирования и технологии

СИ: "int a[3]={1, 2, 3}, * p=a+1" Чему равно значение выражения "p[0]-2"? И что вообще здесь происходит?

На сколько я понял, задан массив a[3] из трех символов, но что такое * p=a+1 и p[0]-2 и как это считается?
int a[3] — это массив из трех целых чисел.
*p — это указатель на целое число. Он хранит адрес ячейки памяти, в которой записано указанное им число.
В данном случае p заставили указывать на начало массива a, но со сдвигом на один элемент вперед. То есть если взять элемент, на который указывает p, то получим p[0] == a[1]. Из этого числа вычитаем 2, получаем значение p[0]-2.
S_A_Y_A_S_A_T A_M_A_B_O_L
S_A_Y_A_S_A_T A_M_A_B_O_L
83 735
Лучший ответ
Рустембек Нигметов Понятно, спасибо. А почему p[0] а не просто p? Первый (и по совместительству единственный) элемент в указателе, а a[1] это второй элемент массива "а", я все правильно понял? А если просто "p" указать?
вижу что всё объяснили
в дополнение посоветую книжку
Керниган, Ричи "искусство программирования на Си"
Это библия сишников от создателей языка
есть в сети -достаточно чуть погуглить
В общем уже ответили. Добавлю, что выражение * p=a+1 нельзя рассматривать отдельно, меняется его смысл. Чтоб смыл сохранился, надо писать так:
int* p=a+1; // объявили переменную p - указатель на int, и присвоили ей значение a+1
или так
int* p; // объявили переменную
p=a+1; // присвоили значение
Лучше читать книгу, там всё это объясняется.
Сергей Лунков
Сергей Лунков
36 282
задан массив длины три и проинициализирован тремя целочисленными значениями.
далее указателю p присвоен адрес, элемента, следующего за началом массива.
значение выражения равно 0.
здесь происходит адресная арифметика.

на пальцах. пусть есть память:
XXXXX001 :
XXXXX002 :
XXXXX003 :
XXXXX004 :
XXXXX005 :
XXXXX006 :

выделяем и инициализируем массив а. память принимает вид:
XXXXX001 : XXXXX002 // значение переменной a типа int[], хранящей адрес нулевого элемента массива
XXXXX002 : 1 // 0-е значение массива
XXXXX003 : 2 // 1-е значение массива
XXXXX004 : 3 // 2-е значение массива
XXXXX005 :
XXXXX006 :

заводим переменную p и присваиваем ей a+1. память принимает вид:
XXXXX001 : XXXXX002 // значение переменной a
XXXXX002 : 1 // 0-е значение массива
XXXXX003 : 2 // 1-е значение массива
XXXXX004 : 3 // 2-е значение массива
XXXXX005 : XXXXX003 // переменная p типа int*, значение которой равно a+1
XXXXX006 :

в общем, как-то так.
Сергей Лунков Переменная "a" не хранится в памяти, поскольку её нельзя изменить, это константный указатель. "a" просто заменяется на XXXXX002.