Форум программистов, компьютерный форум CyberForum.ru

Проход матрицы используя указатели - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.67
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
31.12.2009, 17:48     Проход матрицы используя указатели #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
46
47
48
49
50
#include <stdio.h>
#include <stdlib.h>
 
int R(int* a)
{
    //иницыализирую переменные под сумы
    int sc = 0, sb;
    //создаю дополнительный указатель
    int* d = a;
    //считаю суму для 1-ой строчки
    for (int i = 0; i < 17; ++i)
    {
        sc += *d;
        d += sizeof(int);
    }
    //считаю сумы для последующих строк
    //и сверяю их с сумою первой строки
    for (int j = 1; j < 17; ++j)
    {
        sb = 0;
        int* d = a + 17*j*sizeof(int);
        for (int i = 0; i < 17; ++i)
        {
            sb += *d;
            d += sizeof(int);
        }
        //если сумы не совпали вывожу 0
        if (sc != sb) return 0;
    }
    return 1;
}
 
int main()
{
    //завожу масив и рандомно его забиваю
    int a[17][17];
    for (int i = 0; i < 17; ++i)    
    {
        for (int j = 0; j < 17; ++j)    
        {
            a[i][j] = rand() % 100 - 50;
            printf("%4d",a[i][j]);
        }
        printf("\n");
    }
    //вызываю функцию
    if ( R(a) ) printf("Yes\n");
    else printf("No\n");
    return 0;
}
но wxDev-C++ упорно твердит следующее: 46 C:\Documents and Settings\Администратор\Рабочий стол\ОПіАМ\ІІ семестр\lab_3_99\lab_3_99(2).cpp cannot convert `int (*)[17]' to `int*' for argument `1' to `int R(int*)'
может кто-то сказать где ошибка, если можно, немного коментов, или пример верного использования (в моем случае)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gravity
 Аватар для Gravity
555 / 549 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
31.12.2009, 17:59     Проход матрицы используя указатели #2
Цитата Сообщение от outoftime Посмотреть сообщение
но wxDev-C++ упорно твердит следующее: 46 C:\Documents and Settings\Администратор\Рабочий стол\ОПіАМ\ІІ семестр\lab_3_99\lab_3_99(2).cpp cannot convert `int (*)[17]' to `int*' for argument `1' to `int R(int*)'
Ага, потому что передаешь двумерный массив, а в определении функции одинарный указатель. Прально будет "int R(int a[][17])".

Добавлено через 2 минуты
Цитата Сообщение от outoftime Посмотреть сообщение
d += sizeof(int);
sizeof здесь не нужен, d и так указатель типа int, при инкрементировании он будет смещаться на интовый адрес.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
31.12.2009, 18:08  [ТС]     Проход матрицы используя указатели #3
решил проблему следующим образом: так как я не знаю что делать с матрицами, взял одномерный масив размером 17*17 и все заработало.
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
46
47
48
#include <stdio.h>
#include <stdlib.h>
 
int R(int* a)
{
    //иницыализирую переменные под сумы
    int sc = 0, sb;
    //создаю дополнительный указатель
    int* d = a;
    //считаю суму для 1-ой строчки
    for (int i = 0; i < 17; ++i)
    {
        sc += *d;
        d += sizeof(int);
    }
    //считаю сумы для последующих строк
    //и сверяю их с сумою первой строки
    for (int j = 1; j < 17; ++j)
    {
        sb = 0;
        int* d = a + 17*j*sizeof(int);
        for (int i = 0; i < 17; ++i)
        {
            sb += *d;
            d += sizeof(int);
        }
        //если сумы не совпали вывожу 0
        if (sc != sb) return 0;
    }
    return 1;
}
 
int main()
{
    //завожу масив и рандомно его забиваю
    int a[289];
    for (int i = 0; i < 289; ++i)    
    {
            if (i % 17 == 0) printf("\n");
            a[i] = rand() % 100 - 50;
            printf("%4d",a[i]);
    }
    //вызываю функцию
    if ( R(a) ) printf("\nYes\n");
    else printf("\nNo\n");
    getchar();
    return 0;
}
Вопрос: что делать с матрицей?

Добавлено через 7 минут
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
46
47
48
49
50
#include <stdio.h>
#include <stdlib.h>
 
int R(int* a[][])
{
    //иницыализирую переменные под сумы
    int sc = 0, sb;
    //создаю дополнительный указатель
    int* d = a;
    //считаю суму для 1-ой строчки
    for (int i = 0; i < 17; ++i)
    {
        sc += *d;
        d += sizeof(int);
    }
    //считаю сумы для последующих строк
    //и сверяю их с сумою первой строки
    for (int j = 1; j < 17; ++j)
    {
        sb = 0;
        int* d = a + 17*j*sizeof(int);
        for (int i = 0; i < 17; ++i)
        {
            sb += *d;
            d += sizeof(int);
        }
        //если сумы не совпали вывожу 0
        if (sc != sb) return 0;
    }
    return 1;
}
 
int main()
{
    //завожу масив и рандомно его забиваю
    int a[17][17];
    for (int i = 0; i < 17; ++i)    
    {
        for (int j = 0; j < 17; ++j)    
        {
            a[i][j] = rand() % 100 - 50;
            printf("%4d",a[i][j]);
        }
        printf("\n");
    }
    //вызываю функцию
    if ( R(a) ) printf("Yes\n");
    else printf("No\n");
    return 0;
}
все ровно ругается, да еще сильнее:
5 C:\Documents and Settings\Администратор\Рабочий стол\ОПіАМ\ІІ семестр\lab_3_99\lab_3_99(2).cpp declaration of `a' as multidimensional array must have bounds for all dimensions except the first
C:\Documents and Settings\Администратор\Рабочий стол\ОПіАМ\ІІ семестр\lab_3_99\lab_3_99(2).cpp In function `int R()':
9 C:\Documents and Settings\Администратор\Рабочий стол\ОПіАМ\ІІ семестр\lab_3_99\lab_3_99(2).cpp `a' was not declared in this scope
C:\Documents and Settings\Администратор\Рабочий стол\ОПіАМ\ІІ семестр\lab_3_99\lab_3_99(2).cpp In function `int main()':
5 C:\Documents and Settings\Администратор\Рабочий стол\ОПіАМ\ІІ семестр\lab_3_99\lab_3_99(2).cpp too many arguments to function `int R()'
47 C:\Documents and Settings\Администратор\Рабочий стол\ОПіАМ\ІІ семестр\lab_3_99\lab_3_99(2).cpp at this point in file
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
31.12.2009, 18:18     Проход матрицы используя указатели #4
Вариант:
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
46
47
48
49
50
51
52
53
54
#include <stdio.h>
#include <stdlib.h>
 
int R(int** a)
{
    //иницыализирую переменные под сумы
    int sc = 0, sb;
    //создаю дополнительный указатель
    int** d = a;
    //считаю суму для 1-ой строчки
    for (int i = 0; i < 17; ++i)
    {
        sc += d[0][i];
        
    }
    //считаю сумы для последующих строк
    //и сверяю их с сумою первой строки
    for (int j = 1; j < 17; ++j)
    {
        sb = 0;
        for (int i = 0; i < 17; ++i)
        {
                sb += d[j][i];
                
        }
        //если сумы не совпали вывожу 0
        if (sc != sb) return 0;// если хоть одна сумма не совпала, то возвращаем 0
    }
        return 1;// вернется если все суммы совпали
}
 
int main()
{
    //завожу масив и рандомно его забиваю
    int **a, n, i, j;
    printf("Razmernost massiva: ");
    scanf("%d", &n);
    a = (int **)malloc (n * sizeof (int *));
    for (i = 0; i < n; i++)
    a [i] = (int *)malloc (n * sizeof (int));
    for ( i = 0; i < n; ++i)    
        {
        for (j = 0; j < n; ++j)    
                {
            a[i][j] = rand() % 100 - 50;
            printf("%4d",a[i][j]);
        }
        printf("\n");
    }
        //вызываю функцию
    if ( R(a) ) printf("Yes\n");
        else printf("No\n");
    return 0;
}
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
31.12.2009, 18:25  [ТС]     Проход матрицы используя указатели #5
valeriikozlov, на сколько я понял с указателем на масив можно обращатся также как и с масивом (касательно индексов)?
непонятна строчка:
C++
1
a = (int **)malloc (n * sizeof (int *));
все что я понял что выделяется память, под масив, только размерность не n, a n*n, так как надо матрицу, а вот зачем преобразование int** ?
и почему sizeof (int *) а не sizeof (int)
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
31.12.2009, 22:37     Проход матрицы используя указатели #6
C
1
2
3
        a = (int **)malloc (n * sizeof (int *));// выделяем память под массив указателей размером n*sizeof (int *) и присваиваем переменной "a" адрес выделенной памяти
        for (i = 0; i < n; i++)
        a [i] = (int *)malloc (n * sizeof (int));// в цикле выделяем память размером n * sizeof (int) и присваиваем переменным a [i] адрес выделенной памяти
В общем так создается двумерный массив.

Добавлено через 4 часа 6 минут
Сильно на скудные объяснения не обижайтесь. Если все-таки остались вопросы по созданию двумерного массива, задавайте, отвечу обязательно.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
01.01.2010, 02:57  [ТС]     Проход матрицы используя указатели #7
Цитата Сообщение от outoftime Посмотреть сообщение
почему sizeof (int *) а не sizeof (int)
вот это вопрос не ясен, ксати с Новым Годом всех!
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
01.01.2010, 07:09     Проход матрицы используя указатели #8
В этом коде создатся двумерная матрица. Создается она так: сначало объявляется переменная int **a; - это переменная объявлена как указатель на массив указателей (одномерный) на массивы (одномерные) с элементами типа int.
И соответственно массив двумерный мы создаем так:
Сначало выделяем память под массив указателей (одномерный):
C
1
a = (int **)malloc (n * sizeof (int *));
Заметьте, не под массив элементов типа int, а под массив указателей, каждый из которых будет указывать на одномерный массив элементов типа int.
А затем в цикле:
C
1
2
        for (i = 0; i < n; i++)
        a [i] = (int *)malloc (n * sizeof (int));
Выделяем n раз память для массива элементов типа int размером n (одномерного), присваивая каждый раз адрес выделенной памяти уже объявленным указателям: a [i].
Вот так получается создание двумерного массива (динамически).
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
01.01.2010, 14:05  [ТС]     Проход матрицы используя указатели #9
Вот мой код:
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
#include <stdio.h>
#include <stdlib.h>
 
int R(int** a, int n)
{
    int sb = 0, sc = 0;
    for (int i = 0; i < n; ++i)
    {
        (i) ? sb = 0 : sc = 0;
        for (int j = 0; j < n; ++j)
            (i) ? sb += a[i][j] : sc += a[i][j];
        if (sc != sb && i) return 0;
    }
    for (int i = 0; i < n; ++i)
    {
        (i) ? sb = 0 : sc = 0;
        for (int j = 0; j < n; ++j)
            (i) ? sb += a[j][i] : a[j][i];
        if (sb != sc && i) return 0;
    }
    return 1;
}
 
int main()
{
    int n;
    scanf("%d", &n);
    int** a = (int**) malloc(n * sizeof(int*));
    for (int i = 0; i < n; ++i)
        a[i] = (int*) malloc(n * sizeof(int*));
    for (int i = 0; i < n; ++i)
    {
        printf("\n");
        for (int j = 0; j < n; ++j)
        {
            a[i][j] = rand() % 100 - 50;
            printf("%4d", a[i][j]);
        }
    }
    printf(R(a, n) ? "\n\nYes\n" : "\n\nNo\n");
    return 0;
}
но не смотря на то что писал я сам, только раз подглянул, когда провтыкал преобразованые в инт** делать, я все еще не понимаю принцыпа обращения элементам масива, а именно когда мы выделяем память под масив указателей все ясно выделяется место под "эн" элементов, но почему к ним можно обращаться как к элемнтам масива? похожая ситуация: int a = n; int b(n); ведь оба эти обьявления верны и мало того b == a, с указателями также эсть какая-то фишка с индексами, верно?
если есть можете просветить, просьба на одномерном масиве, что-бы легче понимать было

Добавлено через 15 минут
и еще по sizeof(int*); получается мы выделяем память под интовый указатель, но ведь размер памяти, необходимые для указателя меньший за размер инта, для этого в принцыпе и служать указатели, верно?
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
01.01.2010, 14:45     Проход матрицы используя указатели #10
Голова плохо работает. Может из-за этого плохо воспринял вопрос, но думаю что ответ дам исчерпывающий. На самом деле, выделяя динамически память под двумерный массив (например для массива размерностью n*n), мы всегда выделяем просто память. все вот эти деления двумерный или одномерный это придумали мы сами. Для компьютера, что двумерный массив размером 3*3 для типа int, что одномерный размерностью 9 типа int, без разницы. Даже объявить например можно так:
C
1
int a[3][3]={1,2,3,4,5,6,7,8,9};
И в дальнейшем обращаться можно a[2][0] (это значение будет в данном случае 7).
В С можно объявить поэтому динамически массив 3*3 так:
C
1
int *a= (int *)malloc (3 * 3*sizeof (int));
или
C
1
int a= (int *)malloc (9*sizeof (int));
а потом обращаться к элементу массива так (например к элементу во второй строке, нулевом столбце): *(a+6), т.е. не очень удобно в последующих обращениях, вот поэтому есть вариант который я показал в своем коде (в посте 4), там обращаться можно к тому же элементу вот так: a[2][0].
Разница еще есть в том что если выделять память как писал здесь выше, то память выделяется сразу вся с одним адресом. А если выделять как писал в посте 4, то выделяется память n раз, и каждый раз адрес выделяемой памяти присваивается разным указателям. И в этом случае *(a+6) - уже даст неправильный результат.
Цитата Сообщение от outoftime Посмотреть сообщение
sizeof(int*);
- размер указателя на память для хранения int. Сам не проверял никогда, но есть большое подозрение, что на разных компьютерах это значение будет разным, как и размеры различных встроеных типов.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
01.01.2010, 15:37  [ТС]     Проход матрицы используя указатели #11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <stdlib.h>
 
void R(int n[])
{
    for (int i = 0, _b(sizeof(n) / sizeof(n[0])); i < _b; ++i)
        printf("%d",n[i]);
}
 
int main()
{
    int n[] = {0,1,2,3,4,5};
    R(n);
    getchar();
    return 0;
}
ладно, сделаю вид что понял, может с опытом как-то прийдет.. сейчас меня инетерует почему не работает вышеприведенный код.
компилятор wxDec-C++ лексических ошибок нет, но выводит только 1-ый елемент масива
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
01.01.2010, 17:27     Проход матрицы используя указатели #12
Этот код и не будет работать. Я могу его исправить что бы он работал, но думаю для Вас это не так важно.
C
1
int n[] = {0,1,2,3,4,5};
Вот так можно писать, здесь вы создаете статически массив
C
1
{0,1,2,3,4,5};
и присваиваете его int n[] - указателю на массив неизвестного размера. Так делать можно, компилятор пропустит. Но вот этот код, я опишу с точки зрения компилятора, что бы было понятнее:
C
1
2
3
4
5
void R(int n[])// в параметрах функции будет передаваться указатель на массив неивестного размера. Именно в этой строчке будет создаваться копия указателя на массив элементов типа int неизвестного размера, а значит размер массива будет избран равным 1. 
{
    for (int i = 0, _b(sizeof(n) / sizeof(n[0])); i < _b; ++i)// ну а дальше все понятно
        printf("%d",n[i]);
}
Вы попробуйте, что бы разобраться написать вот так:
C
1
2
3
int n[] = {0,1,2,3,4,5};// разница в том, что в этой строке, мы сразу инициализируем и переменную n и размер массива на который она будет указывать
for(int i=0; i<6; i++)
printf("%d ", n[i]);
а потом так:
C
1
2
3
4
int n[];// а вот здесь мы этот момент упустили
n = {0,1,2,3,4,5};// теперь так сделать не получится
for(int i=0; i<6; i++)
printf("%d ", n[i]);
Добавлено через 13 минут
Цитата Сообщение от outoftime Посмотреть сообщение
ладно, сделаю вид что понял, может с опытом как-то прийдет..
обязательно прийдет. Еще раз повторюсь: нет двумерных массивов в компьютере. Их придумали люди, которым это придумывание, помогает решить например задачи СЛАУ, задачи вывода на экран изображений, задачи связанные с лабиринтами и т.п. А решение задачи создания двумерных массивов было примерно таким: на данный момент можно выделять память под какие-либо подряд идущие элементы. А если выделить два раза такую память, то уже получается двумерный массив в две строки. Люди же умные существа, обязательно обойдут любую преграду, даже до которой компьютер не додумается (на самом деле думающий из них обоих только один).
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
01.01.2010, 19:42  [ТС]     Проход матрицы используя указатели #13
со второй разобрался, вот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
 
void R(int n[], int a)
{
    for (int i = 0; i < a; ++i)
        cout << n[i] << " ";
}
 
int main()
{
    int n[] = {1,2,3,4,5};
    R(n, sizeof(n)/sizeof(n[0]));
    getchar();
    return 0;
}
просто надо размер определять в зоне видимости масива (как вы уже говорили в функции размер ссылки равен инту, и соответственно в результате деления результатом будет "1")

Добавлено через 47 минут
есть вопрос: можно ли увеличивать размер масива в процесе работы? допустим был масив интов размером "эн" мы его обьявили в начале програмы так: int* a = (int*) malloc (n * sizeof(int)); а в конце нужно добавить еще 3 элемента, как это реализовать?
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
02.01.2010, 06:32     Проход матрицы используя указатели #14
REALLOC

#include <malloc.h> требуется только для объявления
функции

char *realloc(ptr,size);
char *ptr; указатель на ранее захваченный
блок памяти
unsigned size; новый размер в байтах

Описание.

Функция realloc изменяет размер ранее захваченного блока
памяти. Аргумент ptr указывает на начало блока. Аргумент size за-
дает новый размер блока в байтах. Содержимое блока не изменяется.
Аргумент ptr может указывать на блок, который должен быть осво-
божден прежде, чем последуют вызовы calloc, halloc, malloc,
realloc.
А это небольшой пример использования:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <malloc.h>
int main()
{
    char *alloc;
          
     /*  выбирает  достаточно  большое  пространство для 50
     символов */
     alloc=(char *) malloc(50*sizeof(char));
            
    /* перезахватывает блок, который содержит 100 символов */
    if (alloc != NULL)
       alloc=(char *)realloc(alloc,100*sizeof(char));
    return 0;
}
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
02.01.2010, 10:56  [ТС]     Проход матрицы используя указатели #15
Полагаю наилучший вариант увеличивать размер на 10% от рамрема блока, но меня интересует другое: касательно выделения памяти,если мы переопределим размер блока больше чем он был до того, добираться память будет со свободного пространства или с того что следует за последним байтом текущего блока?

Добавлено через 6 минут
и еще какая разница между malloc и calloc. По описанию второй только для масивов, но и первым это можно сделать, вчем тогда разница?
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
02.01.2010, 10:56     Проход матрицы используя указатели #16
В случае использования realloc() будет выделена память со свободного пространства под весь новый блок. Для последнего приведенного мною примера, адрес записанный в alloc, изменится после вызова realloc(). Обращение к элементам в выделенной памяти останется таким же как и было (например *(alloc+64)), за границу выделенной памяти не убежите.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
02.01.2010, 11:03  [ТС]     Проход матрицы используя указатели #17
касательно списков, они реализируються путем создания нового обьекта, а потом указатель ставится в зависимости от типа списка, можно сделать масив указателей, который может расширятся, и указателям которого мы будем ставить в соответствие определенную структуру (пример со списком не совсем удачен, здесь суть в создании динамического масива структур)

Добавлено через 2 минуты
Цитата Сообщение от valeriikozlov Посмотреть сообщение
под весь новый блок
это под блок k-n? где n - предыдущий размер, k - текущий
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
02.01.2010, 11:37     Проход матрицы используя указатели #18
Цитата Сообщение от outoftime Посмотреть сообщение
(пример со списком не совсем удачен, здесь суть в создании динамического масива структур)
Точно.
Цитата Сообщение от outoftime Посмотреть сообщение
это под блок k-n? где n - предыдущий размер, k - текущий
Я не исследовал никогда настолько глубоко процесс реализации realloc(). Поставлю свои комментарии в тот код который приводил раньше:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <malloc.h>
int main()
{
    char *alloc;
          
     /*  выбирает  достаточно  большое  пространство для 50
     символов */
     alloc=(char *) malloc(50*sizeof(char));// в этой строке выделяется динамически память под хранение 50 элементов типа char, адрес выделенной памяти присваивается указателю alloc
            
    /* перезахватывает блок, который содержит 100 символов */
    if (alloc != NULL)
       alloc=(char *)realloc(alloc,100*sizeof(char));// выделяется динамически (совсем новая память, с другим адресом) под хранение 100 элементов типа char, затем в нее копируется все значения элементов из alloc, старая память очищается, а затем адрес новой выделенной памяти присваивается указателю alloc. Можно было присвоить адрес возвращаемой памяти другому указателю. Также эти две функции: malloc() и realloc() можно использовать для любых встроенных типов, а также для типов созданных Вами.
        return 0;
}
Gravity
 Аватар для Gravity
555 / 549 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
02.01.2010, 14:26     Проход матрицы используя указатели #19
Цитата Сообщение от outoftime Посмотреть сообщение
и еще какая разница между malloc и calloc. По описанию второй только для масивов, но и первым это можно сделать, вчем тогда разница?
Код
       calloc() выделяет память для массива из nmemb элементов  по  size  байт
       каждый, и возвращает указатель на выделенную память.  Выделенная память
       обнуляется.

       malloc() выделяет  size  байт  и  возвращает  указатель  на  выделенную
       память. Выделенная память не инициализируется.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.01.2010, 15:34     Проход матрицы используя указатели
Еще ссылки по теме:

C++ Выяснить является ли последовательность возрастающей используя указатели.
C++ Создать динамические массивы, используя указатели
C++ Просуммировать элементы массива используя указатели

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

Или воспользуйтесь поиском по форуму:
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
02.01.2010, 15:34  [ТС]     Проход матрицы используя указатели #20
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
#include <iostream>
using namespace std;
 
class str
{
private:
    char** a;
    int sz;
public:    
    str () 
    {
        sz = 0;
        a = (char**) calloc(1,sizeof(char *));
        a[0] = (char*)calloc(1,sizeof(char *));
    }
    ~str(){}
    void push(char* s)
    {
        a = (char**) realloc(a,(++sz) * sizeof(char *));
        a[sz-1] = (char*) malloc(sizeof(char *));
        a[sz-1] = s;
    }
    void show()
    {
        for (int i = 0; i < sz; ++i)
            cout << a[i] << " ";
        cout << "\nsize = " << sz << endl;
    }
 };
 
int main()
{
    str s;
    char* st = (char*) calloc(100,sizeof(char));
    while (gets(st))
        s.push(st);
    s.show();
    getchar();
    return 0;
}
Можете посмотреть что не так? Я хотел создать клас в котором есть динамический масив строк, типа матрица символов, столкнулся с проблемой: при выводе выводится весь масив, но все значения его элементов равны между собой, если я верно понял, то все указатели просто указывают на одно место, которое может иметь только одно значение, если я правельно понял не подскажете, как в функции show(); выделить память на дополнительную строку?

Добавлено через 8 минут
дргими словами: можно ли выделить память под значение определенного типа, так что-бы после завершения работы блока в котором определена переменная, (тоесть по истечению строка жизни переменной) имея указатель на эту переменную получить ее значение
Yandex
Объявления
02.01.2010, 15:34     Проход матрицы используя указатели
Ответ Создать тему
Опции темы

Текущее время: 10:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru