Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
Pavel081
0 / 0 / 0
Регистрация: 24.10.2014
Сообщений: 9
1

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

10.04.2017, 19:48. Просмотров 1077. Ответов 7

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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2017, 19:48
Ответы с готовыми решениями:

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

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

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

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

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

7
liv
1184 / 1026 / 204
Регистрация: 07.10.2015
Сообщений: 3,156
Завершенные тесты: 1
10.04.2017, 20:02 2
Pavel081, zippo - адрес матрицы, zippo[0] - адрес первой строки матрицы.
Т.к. матрица начинается с первой строки, то и адрес первой строки совпадает с адресом матрицы.
zippo[0][0] - элемент [0][0]
0
Pavel081
0 / 0 / 0
Регистрация: 24.10.2014
Сообщений: 9
10.04.2017, 20:11  [ТС] 3
Да это наверное понятно, просто это пока мне не объясняет то , что по адресу 0060FEF0 должен находиться первый элемент массива, а судя по тому что &zippo[0] = 0060FEF0 , то в той ячейке находится zippo[0], которая вроде как является переменной - указателем на int(на первый элемент массива).
0
shvyrevvg
769 / 570 / 288
Регистрация: 12.05.2016
Сообщений: 1,661
11.04.2017, 03:02 4
Pavel081, почитайте клац
1
11.04.2017, 03:02
liv
1184 / 1026 / 204
Регистрация: 07.10.2015
Сообщений: 3,156
Завершенные тесты: 1
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
Pavel081
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
Миниатюры
Многомерные массивы и указатели  
liv
1184 / 1026 / 204
Регистрация: 07.10.2015
Сообщений: 3,156
Завершенные тесты: 1
12.04.2017, 10:43 7
Лучший ответ Сообщение было отмечено Pavel081 как решение

Решение

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru