Member 13941117 Ответов: 1

Не понимаю, почему два выражения одинаковы


char multi[3][10];

printf("адрес %p/n",multi + 3);
printf("Address is %p\n",*(multi + 3));

Разыменованный адрес совпадает с адресом .... Почему?

Действует ли *(multi + 3) как имя массива и является ли он указателем?

Что я уже пробовал:

Запустил программу, получил тот же адрес ... и не понимаю, как адрес
когда разыменование совпадает с самим адресом

1 Ответов

Рейтинг:
0

OriginalGriff

Это сложно, но это связано с тем, какой тип multi является.
Это что же такое char- Нет, очевидно, нет.
является ли это указателем на a char- Нет.
Так в чем же дело?
multi это массив из трех элементов, каждый из которых представляет собой массив из 10 элементов. char ценности.
Так что же такое, черт возьми, "мульти + 3"? по сути, это незаконный адрес, который оказывается в пределах допустимого пространства памяти потому что multi имеет только три элемента: multi + 0, multi + 1, и multi + 2.
И поскольку вы вообще не инициализируете свой массив, значение "multi + 3", скорее всего, будет первым значением фактического значения. char данные в системе multi[0] время chars, что, вероятно, - но не определенно, это зависит от вашего компилятора и параметров компилятора - 0.

В принципе, не делайте этого.
Попробуйте сделать это с действительными адресами, и вы получите разные результаты, как и следовало ожидать.


Member 13941117

К сожалению, мой плохой. Многомерный массив multi должен был быть объявлен как char multi[5][10], а не multi[3][10]. Таким образом, multi + 3 и *(multi + 3) указывали в пределах выделения памяти multi. Так что мой вопрос не совсем такой, как был задан ранее. И я все еще удивляюсь, почему у них один и тот же адрес. Или даже почему *(multi + 3) - это адрес.

Member 13941117

Моя программа была такова. Обратите внимание на те же адреса при запуске.

#включить <stdio.h>


// char multi[5][10];

char multi[5][10] = {
{'0','1','2','3','4','5','6','7','8','9'},
{'А','Б','С','Д','Е','е','г','ч','я','ж'},
{'А','Б','С','Д','Е','Е','Г','Ч','Я','Ж'},
{'9','8','7','6','5','4','3','2','1','0'},
{С'J','Я','Ч','Г','Е','Е','Д','С','Б','А'}
};

тап_п() {

printf("адрес 9 в четвертой строке - %p\n",&multi[3][0]);
printf("адрес 9 в четвертой строке - %p\n",multi + 3);
printf("адрес 9 в четвертой строке - %p\n",*(multi + 3));


printf("\n\n");

printf("значение в multi[3][0] равно %c\n",multi[3][0]);
printf("значение в multi[3][0] равно %c\n", *(*(multi + 3) + 0));
функции printf("в vvlue от мульти[3][0] - это %с\п",*(*(мульти + 3)));

for (int i = 0; i < 10; i++)
printf("%c",*(*(multi+3) + i));

printf("\n");
}