Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 24.10.2014
Сообщений: 9
1

Многомерные массивы и указатели

10.04.2017, 19:48. Показов 2663. Ответов 7

Author24 — интернет-сервис помощи студентам
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
   int zippo[4][2] = {{2,4},{6,8},{1,3},{5,7}};
 
   printf("    zippo = %p,   zippo + 1 = %p\n", zippo, zippo+1);
 
   printf("zippo[0] = %p, zippo[0] +1 = %p\n", zippo[0], zippo[0] + 1);
 
   printf("  *zippo = %p,   *zippo +1 = %p\n", *zippo, *zippo + 1);
 
   printf("zippo [0][0] = %d\n", zippo[0][0]);
   printf("  *zippo[0] = %d\n", *zippo[0]);
   printf("    **zippo = %d\n", **zippo);
   printf(" My  &zippo[0] = %p\n", &zippo[0]);
   printf(" My  &zippo[0][0] = %p\n", &zippo[0][0]);
   printf("      zippo[2][1]= %d\n", zippo[2][1]);
   printf("*(*(zippo +2) + 1) = %d\n", *(*(zippo+2) +1));
    return 0;
}

ВЫВОД:

zippo = 0060FEF0, zippo + 1 = 0060FEF8
zippo[0] = 0060FEF0, zippo[0] +1 = 0060FEF4
*zippo = 0060FEF0, *zippo +1 = 0060FEF4
zippo [0][0] = 2
*zippo[0] = 2
**zippo = 2
My &zippo[0] = 0060FEF0
My &zippo[0][0] = 0060FEF0
zippo[2][1]= 3
*(*(zippo +2) + 1) = 3

Это из одного учебника по Си, строчки с My я сам добавил.

То есть zippo = &zippo[0]=0060FEF0, при этом zippo[0] тоже должен указывать на первый элемент, то есть и он
равен 0060FEF0. Это вроде как означает, что zippo[0] указывает на место в памяти, где сам же и находится,
хотя в том месте памяти должно находиться интовое значение zippo[0][0] = 2;
Что я такое упускаю, что не могу разобраться?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.04.2017, 19:48
Ответы с готовыми решениями:

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

Многомерные массивы
Дана матрица размера 5х9. Найти суммы элементов всех ее четных строк

Как лучше задавать многомерные динамические массивы?
Прошу прощения за глупые вопросы, ибо новичок, но всё же: как лучше задавать многомерные (возьмём...

Многомерные массивы символов, их описание и расположение в памяти
Многомерные массивы символов, их описание и расположение в памяти. Инициализация многомерных...

7
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
10.04.2017, 20:02 2
Pavel081, zippo - адрес матрицы, zippo[0] - адрес первой строки матрицы.
Т.к. матрица начинается с первой строки, то и адрес первой строки совпадает с адресом матрицы.
zippo[0][0] - элемент [0][0]
0
0 / 0 / 0
Регистрация: 24.10.2014
Сообщений: 9
10.04.2017, 20:11  [ТС] 3
Да это наверное понятно, просто это пока мне не объясняет то , что по адресу 0060FEF0 должен находиться первый элемент массива, а судя по тому что &zippo[0] = 0060FEF0 , то в той ячейке находится zippo[0], которая вроде как является переменной - указателем на int(на первый элемент массива).
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
11.04.2017, 03:02 4
Pavel081, почитайте клац
1
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
11.04.2017, 11:22 5
Pavel081, приведенная ссылка как раз описывает Ваш случай, когда двумерный массив фактически строится, как линейный, одномерный, когда все элементы лежат один за другим. Так обычно задается матрица в глобальной либо локальной памяти на этапе компиляции.
Часто матрица строится динамически. В таком случае также можно запросить место все элементы и построить матрицу линейно. Но можно построить матрицу, как адрес адресов векторов. Когда сначала запрашиваем память под вектор, в которых будут адреса строк матрицы. Затем запрашиваем память под каждую строку. В таком случае элементы разных строк не будут лежать линейно. Преимуществом такого способа является то, что длины каждой строки вполне могут быть разной длины и могут постоянно меняться. Так, например, можно организовать массив строк...
Именно в данном случае адреса zippo и zippo[0] будут разными. Вы думаете, что у Вас второй способ организации матрицы, а у Вас - первый - линейный...

Добавлено через 31 минуту
Второй способ:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <malloc.h> 
#include <stdio.h>
 
int main()
{
    int **a = (int**)malloc(2*sizeof(int*));
    a[0] = (int*)malloc(2*sizeof(int));
    a[1] = (int*)malloc(2*sizeof(int));
    a[0][0] = 3;
    printf("%p %p %d\n", a, a[0], a[0][0]);
    free (a[0]);
    free (a[1]);
    free (a);
}
0
0 / 0 / 0
Регистрация: 24.10.2014
Сообщений: 9
11.04.2017, 20:05  [ТС] 6
Про то как двумерный массив хранится как одномерный я схемы видел, но я нашел пример попроще, так как это распространяется и на одномерные массивы, даже рисунок добавлю для наглядности(ну как я это вижу)
код наверное избыточен, ну да ладно
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int zippo[3] = {1 , 2 , 3};
    int* a = zippo;
    printf("zippo = %p\n", zippo);
    printf("zippo+1 = %p\n", zippo+1);
    printf("*zippo = %d\n", *zippo);
    printf("&zippo = %p\n",&zippo);
    printf("&zippo[0] = %p\n",&zippo[0]);
     printf("&zippo[2] = %p\n",&zippo[2]);
    printf("*a = %d\n",*a);
    printf("&a = %p\n",&a);
 
    return 0;
}
То есть имя массива есть указатель на его первый элемент, указатель- это переменная(занимает свое место в памяти, что сейчас важно ), которая содержит адрес(в нашем случае адрес первого элемента 0060FF04). но когда мы пытаемся взять адрес этой переменной-указателя , то нам выдается адрес первого элемента массива, но раз по этому адресу хранится значение типа int, то там не может храниться переменная-указатель(имя массива). У меня лишь предположение что это специально сделано, что типа нежелательно знать его адрес.
Миниатюры
Многомерные массивы и указатели  
0
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
12.04.2017, 10:43 7
Лучший ответ Сообщение было отмечено Pavel081 как решение

Решение

Цитата Сообщение от Pavel081 Посмотреть сообщение
имя массива есть указатель на его первый элемент
да, имя массива - указатель на массив, но в случае линейного массива - не переменная! Значение указателя нигде не хранится. Его значение известно на этапе компиляции и просто подставляется везде, где используется!
1
0 / 0 / 0
Регистрация: 24.10.2014
Сообщений: 9
12.04.2017, 14:30  [ТС] 8
Спасибо, подозревал такое, но в книге прямым текстом такого не писали
0
12.04.2017, 14:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.04.2017, 14:30
Помогаю со студенческими работами здесь

Массивы указателей и указатели на указатели
В чем разница между массивами указателей и указателями на указатели? Может, между ними такая же...

Указатели и массивы
Всем привет.Подскажите,почему нельзя приравнивать элементы массива через адреса элементов?Т.е....

Указатели и массивы
День добрый всем. Есть такие интересующие меня строчки, которые я не могу до конца понять: ...

Массивы и указатели в С для начинающих
Создать матрицу, элементы которой образуют конверт (заполнить внешний периметр и диагонали любым...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru