Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > typedef и new - Непонятен принцип работы


Автор: n199a 7.7.2013, 00:02
Пишу как научился, а то некоторым может показаться глупым расписываение элементарных вещей  smile 
Код

#include <stdio.h>

typedef int row[10];         //новый тип: массив из 10 элементов
main() {
    int N;

    row *A;              //указатель на массив

    printf("Введите число строк: ");
    scanf("%d", &N);

    A = new row[N];      //выделить память на N строк
    A[0][1] = 25;              //в ячейук 0:1 заносим число 25
    printf("%d", A[0][1]);

    delete A;                  //освобождаем память.
}


typedef говорит нам, что, любая переменная типа row (т.е. это как int, float и т.п.?) является указателем на целое число или на адрес массива целых чисел (в моем случает - это адрес массива). Как через отладчик посмотреть адрес массива в памяти?

row[10] - это одномерный массив, у которого (далее простым языком) есть одна "строчка" в которой расположены 10 чисел).
row *A - в указатель *А записывается адрес массива row.
A = new row[N]; - на сколько я понимаю, указатели дальше пишутся без знака "*" ?
Вообще не понятно, как одномерный массив превратился в матрицу?

Автор: akizelokro 7.7.2013, 01:11
row в тайпдефе определен как пользовательский тип int <пропускаем row> [10]
row[N] определяется уже как int <пропускаем row> [10][N]

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com//object-id51d886056ccc199878000002#findElement_E7045_51d895f96ccc19ee6600151c_0

Автор: akizelokro 7.7.2013, 08:27
Эти скобки никакого отношения к реальным, принятым в С++ не имеют. Просто так удобней для понимания, а скобки можно любые поставить. Они для выделения, что там где-то для компилятора виднеется row, но виднеется в таком виде. что как бы есть, но по сути нет.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com//object-id51d886056ccc199878000002#findElement_E7045_51d8fc506ccc1990610002f8_0

Автор: vvms 8.7.2013, 04:19
Если уж:
Цитата

A = new row[N];      //выделить память на N строк

то нужно и 
Код

delete [] A;

а не:
Цитата

delete A;                  //освобождаем память.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)