Ну теперь я начал понимать к чему вы клоните, я про абсолютные адреса переменных, но понять не могу для чего нужна такая жёсткая привязка. Допустим у нас есть массив 10, 50 да хоть 100 элементов, присвоили ему имя и обращаетесь к нему по имени и номеру(индексу) к конкретному элементу этого массива. Я никогда не задавался вопросом привязывать массив к определённому месту в оперативке, это же задача компилятора, да и язык С это язык высокого уровня, там такие мелочи обычно опускаются. По поводу жёсткой привязки это похоже на ход мыслей при написании на ассемблере.
По поводу массива, вы почему то его насильно пытаетесь склонить к структуре. Структура может в себе содержать поля с разными типами переменных и в том числе и адрес. А массив это энное количество однотипных элементов, т.е. если вы объявили тип int то все элементы в массиве будет по 2 байта и типа int. Можно конечно поместить в этот массив адреса, если они имеют размер 2 байта.
Пример массива:
int arr[10]={0,1,2,3,4,5,6,7,8,9};
Если же нужно передать значение в функцию то просто передаём адрес массива, опять же не важно где он находиться в оперативной памяти.
Код: Выделить всё
int k;
void fn(int *t)// какая то функция в которую передаётся указатель на переменную типа int
{
*t=3; //по адресу обращаемся к переменной
}
void main()
{
k=2;
fn(&k); //получаем адрес k и передаём его в функцию, так же можно и адрес массива
// здесь уже k=3
}
p1 = *arr[1], вызывает ошибку.
Ну всё логично, вы объявили массив как одномерный а пытаетесь обращаться как двухмерному массиву(одномерный массив это строка, а двухмерный это набор строк)
Объявление двухмерного массива:
int arr[2][3]={{1,2,3},{4,5,6}};
Или же:
char[3][12]={{"Понедельник"},{"Вторник"},{"Среда"}};