Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 1

Почему разные адреса одного и того же элемента динамического массива?

17.09.2016, 23:12. Показов 1041. Ответов 6

Студворк — интернет-сервис помощи студентам
Я создаю динамический массив и отправляю его в функцию, если потом сравнивать адреса элементов массива в главной и вызываемой функции они различаются (кроме 1-ой строки), почему так происходит? Они же должны ссылаться на один и тот же адрес в памяти.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
 
using namespace std;
 
void Go(char **mas, int N, int M)
{
    cout << "Адресация элементов в доп-ф:" << endl;
    for(short i = 0; i < N; ++i)
    {
        for(short j = 0; j < M; ++j)
        {
            cout << mas[i][j] << " = " << &(&mas)[i][j] << endl;
        }
        cout << endl;
    }
}
 
int main(int argc, char **argv)
{
    int M = 3;
    int N = 3;
    string text = "Hello_World!";
 
    char **mas = new char* [N]; //строки
    for(short i = 0; i < N; ++i)
    {
        mas[i] = new char[M]; //столбцы
        for(short j = 0; j < M; ++j)
            mas[i][j] = text[i * M + j];
    }
 
    cout << "Адресация элементов в гл-ф:" << endl;
    for(short i = 0; i < N; ++i)
    {
        for(short j = 0; j < M; ++j)
        {
            cout << mas[i][j] << " = " << &(&mas)[i][j] << endl;
        }
        cout << endl;
    }
 
    Go(mas, N, M);
 
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.09.2016, 23:12
Ответы с готовыми решениями:

Почему происходит инициализация только первого элемента динамического массива структуры?
Здравствуйте. Я пишу программу для табулирования функции cos(x). Аргументы и значение функции нужно записать в массив структуры. Проблема в...

Разные адреса одной и той же переменной. Почему?
Вот сам наткнулся на такую вещь. int * GETAdress(int tmp) { return &amp;tmp; } int main() { int a = 6; int *pa;

Как наложить разные текстуры на разные грани одного и того же куба?
ЗДРАВСТВУЙТЕ! Подскажите пожалуйста как наложить разные текстуры на разные грани одного и тогоже куба?

6
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
17.09.2016, 23:19
Адрес элемента: mas[i] + j
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
17.09.2016, 23:30
Цитата Сообщение от zRirez Посмотреть сообщение
&(&mas)[i][j]
C++
1
(void*)&(mas[i][j])
0
14 / 14 / 5
Регистрация: 16.01.2016
Сообщений: 81
17.09.2016, 23:31
если не ошибаюсь можно адресовать через начало строки( адрес) плюс смещение на столбец элемента.
т.е. если 5 строк, то можно получить 5 указателей на каждую строку. Это не считаю указателя на массив- он будет совпадать с адресом первой строки.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12932 / 6800 / 1820
Регистрация: 18.10.2014
Сообщений: 17,211
18.09.2016, 00:26
Цитата Сообщение от zRirez Посмотреть сообщение
если потом сравнивать адреса элементов массива в главной и вызываемой функции они различаются (кроме 1-ой строки), почему так происходит?
Если доступ к элементу вашего массива делается как mas[i][j], то очевидным образом адрес элемента вашего массива дается выражением &mas[i][j]. И все.

А ваше &(&mas)[i][j] - это какая-то белиберда, никакого отношения к адресу элемента не имеющая. С чего это вдруг вы тут решили выполнить такое "многоэтажное" применение оператора &?

Исправляйте на &mas[i][j] и будет прекрасно видно, что адреса элементов везде одинаковы.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
18.09.2016, 00:30
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Исправляйте на &mas[i][j] и будет прекрасно видно, что адреса элементов везде одинаковы.
Это адрес char будет, с соответствующим выводом через cout <<.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12932 / 6800 / 1820
Регистрация: 18.10.2014
Сообщений: 17,211
18.09.2016, 00:39
Цитата Сообщение от nd2 Посмотреть сообщение
Это адрес char будет, с соответствующим выводом через cout <<.
Да, верно. Для вывода значения адреса через cout надо не забыть привести этот указатель к типу void *.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.09.2016, 00:39
Помогаю со студенческими работами здесь

Разные браузеры отдают разные html одного и того же сайта? по какому параметру это определяется?
К примеру сайт 1800contacts.com. В мозилле одна версия html, в chrome другая. Не могу понять. Многое перечитал уже. Может куку какую то...

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

в DHCP хранятся для одного имени ПК разные ip адреса
на сервере развернуто DNS, DHCP, AD в DHCP хранятся для одного имени ПК разные ip адреса. Из за чего может быть? На пример наблюдаю...

Сегментный регистр DS, CS, данные копируются из одного и того же адреса
ребята, скажите почему я ставлю 'mov ds адрес', и 'mov cs адрес' копируются данные из одного и того же адреса, хотя значение в сегменте DS...

Почему при присваивании адреса массива не ставится знак '&' получения адреса
int main() { int a = { 2, 3 }; int* b; b = a; //Почему при присваивании адреса массива не ставится знак '&amp;' получения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
YAFU@home — распределённые вычисления для математики. На CPU
Programma_Boinc 20.01.2026
YAFU@home — распределённые вычисления для математики. На CPU YAFU@home — это BOINC-проект, который занимается факторизацией больших чисел и исследованием aliquot-последовательностей. Звучит. . .
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru