Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 05.03.2023
Сообщений: 17

Передача динамического массива в функцию

05.03.2023, 16:36. Показов 1964. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не могу правильно передать массив в функции. В main происходит оглашение указателя на массив int* p и его длину int N; в scan происходит выделение памяти под этот массив. Функция print не может вывести массив на экран (такое ощущение, что она выводит пустой массив). Если вставить промежуточную печать в scan, то массив спокойно выводится.
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
void scan(int* p, int N);
void print(int* p, int N);
void add(int* p, int N);
void del(int* p, int N);
void freedom(int* p);
 
int main(){
    
    int* p = NULL;  
    int N = 0;      
    system("chcp 1251"), system("cls");
    
    printf("+====================================+\n");
    printf("|1 — создать масив                  |\n");
    printf("|------------------------------------|\n");
    printf("|2 — напечатать масив               |\n");
    printf("|------------------------------------|\n");
    printf("|3 — добавить один/несколько элементов  |\n");
    printf("|------------------------------------|\n");
    printf("|4 — удалить один/несколько элементов|\n");
    printf("|------------------------------------|\n");
    printf("|5 — освободить память               |\n");
    printf("|------------------------------------|\n"); 
    printf("|0 — выход                           |\n");
    printf("+====================================+\n");
 
    char menubar;
    scanf("%d", &menubar);
    switch(menubar){
        case 0:
        printf("\nВыход");
        return 0;
        
        case 1:
        scan(p, N);
        system("pause");
        system("cls");
        return main();
        
        case 2:
        print(p, N);
        system("pause");
        system("cls");
        return main();
        
        case 3:
        add(p, N);
        system("pause");
        system("cls");
        return main();
 
        case 4:
        del(p, N);
        system("pause");
        system("cls");
        return main();
        
        case 5:
        freedom(p);
        system("pause");
        system("cls");
        return main();
        
        default:
        printf("\nОшибка");
        return main();
    }
    system("pause");
    return 0;
}
 
void scan(int* p, int N){
    printf("Введите размер массива: ");
    scanf("%d", &N);
    p = (int*) malloc(N*sizeof(int));
    if(NULL==p){
        printf("Недостаточно памяти\n");
        exit(1);
    }
    int a;
    srand(time(NULL));
    printf("Для автозаполнения нажмите \"1\", для заполнения вручную нажмите \"0\": ");
    scanf("%d", &a);
    if(a==1)
        for (int i=0; i<N; ++i)
            *(p+i) = rand()%10; 
    if(a==0){
        printf("Введите элементы через пробел: ");
        for (int i=0; i<N; ++i)
            scanf("%d", &p[i]);
    }
    for (int i=0; i<N; ++i){
        printf("%3d", p[i]);
    }
    printf("\n");
}
 
void print(int* p, int N){
    for (int i=0; i<N; i++)
        printf("%3d", p[i]);
    printf("\n");
}
 
void add(int* p, int N){
    int M, i;
    printf("Введите количество элементов, которые нужно добавить в массив: ");
    scanf("%d", &M);
    p = (int*) realloc(p, (N+M)*sizeof(int));
    if(NULL==p){
        printf("Недостатньо пам’яті\n");
        exit(1);
    }
    printf("Введите на какое место поставить первый элемент (від 1 до N включно): ");
    int x;
    scanf("%d", &x);
    printf("Введите значения этих элементов через пробел: ");
    for (i=N+M-1; i>=x+M-1; --i) {
        p[i] = p[i-M];
    }
    for (int i=x-1; i<x+M-1; ++i) {
        scanf("%d", &p[i]);
    }
    N += M;
    for (i=0; i<N; ++i){
        printf("%3d", p[i]);
    }
    printf("\n");
}
 
void del(int* p, int N){
    int M;
    printf("Введите количество элементов, которые нужно удалить: ");
    scanf("%d", &M);
    if (M <= 0) {
        printf("Число елементов для удаления должно быть больше нуля!\n");
        return;
    }
    if (M > N) {
        printf("Число елементов для удаления не должно быть больше чем размер массива!\n");
        return;
    }
    printf("С какого елемента начинать удаление (від 1 до N включительно): ");
    int x;
    scanf("%d", &x);
    if (x < 1 || x > N) {
        printf("Можно начинать удаление только від 1 до N включительно!\n");
        return;
    }
    for (int i = x - 1; i < N - M; ++i) {
        p[i] = p[i+M];
    }
    p = (int*) realloc(p, (N-M)*sizeof(int));
    if (NULL == p){
        printf("Недостаточно памяти\n");
        exit(1);
    }
    N -= M;
}
 
void freedom(int* p){
    if (NULL == p){
        printf("Недостаточно памяти\n");
        exit(1);
    }
    free(p);    
    p = NULL;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.03.2023, 16:36
Ответы с готовыми решениями:

Передача динамического массива в функцию
Написать функцию, находящую произведение отрицательных элементов каждого столбца, произвольной матрицы. Задать размерность. #include...

Передача динамического массива в функцию
Ох снова я пишу по поводу передачи массивов в функции... Что-то я так и не понял по какому принципу это все работает... Как передать...

Передача динамического массива в функцию
Здравствуйте! Есть главная функция с множеством вложенных. В главную передается динамический массив с размерностью. Во вложенных...

28
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
07.03.2023, 22:57
Студворк — интернет-сервис помощи студентам
Hats, убрал вам предупреждения
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
void scan( int* p, int* pN );
void print( int* p, int N );
void add( int* p, int* pN );
void del( int* p, int* pN );
 
int main(){
 
    int* p = NULL;
    int N = 0;
    system("chcp 1251"), system("cls");
 
    while(1){
        printf("+======================================+\n");
        printf("|1 — создать масив                     |\n");
        printf("|--------------------------------------|\n");
        printf("|2 — напечатать масив                  |\n");
        printf("|--------------------------------------|\n");
        printf("|3 — добавить один/несколько элементов |\n");
        printf("|--------------------------------------|\n");
        printf("|4 — удалить один/несколько элементов  |\n");
        printf("|--------------------------------------|\n");
        printf("|0 — выход                             |\n");
        printf("+======================================+\n");
 
        int menubar;
        scanf("%d", &menubar);
        switch(menubar){
            case 0:
            printf("\nВыход");
            return 0;
 
            case 1:
            scan(p, &N);
            system("pause");
            system("cls");
            break;
 
            case 2:
            print(p, N);
            system("pause");
            system("cls");
            break;
 
            case 3:
            add(p, &N);
            system("pause");
            system("cls");
            break;
 
            case 4:
            del(p, &N);
            system("pause");
            system("cls");
            break;
 
            default:
            printf("\nОшибка\n");
            break;
        }
        continue;
    }
    if (NULL == p){
        printf("Недостаточно памяти\n");
        exit(1);
    }
    free(p);
    p = NULL;
}
 
void scan(int* pp, int* pN){
    printf("Введите размер массива: ");
    scanf("%d", pN);
    pp = (int*) malloc(*pN*sizeof(int));
    if(NULL==pp){
        printf("Недостаточно памяти\n");
        exit(1);
    }
    int a;
    srand(time(NULL));
    printf("Для автозаполнения нажмите \"1\", для заполнения вручную нажмите \"0\": ");
    scanf("%d", &a);
    if(a==1)
        for (int i=0; i<*pN; ++i)
            *(pp+i) = rand()%10;
    if(a==0){
        printf("Введите элементы через пробел: ");
        for (int i=0; i<*pN; ++i)
            scanf("%d", &pp[i]);
    }
    for (int i=0; i<*pN; ++i){
        printf("%3d", pp[i]);
    }
    printf("\n");
}
 
void print(int* p, int N){
    for (int i=0; i<N; i++)
        printf("%3d", p[i]);
    printf("\n");
}
 
void add(int* p, int* pN){
    int M, i;
    printf("Введите количество элементов, которые нужно добавить в массив: ");
    scanf("%d", &M);
    p = (int*) realloc( p, (*pN+M)*sizeof(int) );
    if(NULL==p){
        printf("Недостаточно памяти\n");
        exit(1);
    }
    printf("Введите на какое место поставить первый элемент (от 1 до N включительно): ");
    int x;
    scanf("%d", &x);
    printf("Введите значения этих элементов через пробел: ");
    for (i=*pN+M-1; i>=x+M-1; --i) {
        p[i] = p[i-M];
    }
    for (int i=x-1; i<x+M-1; ++i) {
        scanf("%d", &p[i]);
    }
    *pN += M;
    for (i=0; i<*pN; ++i){
        printf("%3d", p[i]);
    }
    printf("\n");
}
 
void del(int* p, int* pN){
    int M;
    printf("Введите количество элементов, которые нужно удалить: ");
    scanf("%d", &M);
    if (M <= 0) {
        printf("Число елементов для удаления должно быть больше нуля!\n");
        return;
    }
    if (M > *pN) {
        printf("Число елементов для удаления не должно быть больше чем размер массива!\n");
        return;
    }
    printf("С какого елемента начинать удаление (від 1 до N включительно): ");
    int x;
    scanf("%d", &x);
    if (x < 1 || x > *pN) {
        printf("Можно начинать удаление только від 1 до N включительно!\n");
        return;
    }
    for (int i = x - 1; i < *pN - M; ++i) {
        p[i] = p[i+M];
    }
    p = (int*) realloc( p, (*pN-M)*sizeof(int) );
    if (NULL == p){
        printf("Недостаточно памяти\n");
        exit(1);
    }
    *pN -= M;
}
По поводу что "вам ответить нормально не могут", для интереса сравните мой код и свой построчно, например в TotalCommander или другой diff утилите. Там пришлось исправить кучу несоответствий на подобии "переменной типа int* присваивается значение типа int", так что вам нужно начать отличать переменные от указателей и перестать их путать.
Также, дополнительные проблемы приносят "вложенные" указатели, по типу int** pp;. Для работы с массивами любых размерностей ( T arr[X][Y][Z][...]..[..]; ) достаточно в функции принимать их как T* arr и обращаться через *(arr+x) = ... ; Тут в теме мы это подробно разбирали: Передача матрицы в функцию
0
0 / 0 / 0
Регистрация: 05.03.2023
Сообщений: 17
07.03.2023, 23:49  [ТС]
Цитата Сообщение от Evgen173 Посмотреть сообщение
убрал вам предупреждения
Cпасибо, только дальше что? Похоже проклятая у меня программа, print так и не выводит массив
0
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
08.03.2023, 00:24
Лучший ответ Сообщение было отмечено Hats как решение

Решение

Hats, я вас понял, исправления первого уровня вашу задачу не решили. Попробуем снова?
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
void scan( int** pp, int* pN );
void print( int* p, int N );
void add( int** pp, int* pN );
void del( int** pp, int* pN );
 
int main(){
    int* p = NULL;
    int N = 0;
    system("chcp 1251"), system("cls");
 
    while(1){
        printf("+======================================+\n");
        printf("|1 — создать масив                     |\n");
        printf("|--------------------------------------|\n");
        printf("|2 — напечатать масив                  |\n");
        printf("|--------------------------------------|\n");
        printf("|3 — добавить один/несколько элементов |\n");
        printf("|--------------------------------------|\n");
        printf("|4 — удалить один/несколько элементов  |\n");
        printf("|--------------------------------------|\n");
        printf("|0 — выход                             |\n");
        printf("+======================================+\n");
 
        int menubar;
        scanf("%d", &menubar);
        switch(menubar){
            case 0:
            printf("\nВыход");
            return 0;
 
            case 1:
            scan(&p, &N);
            system("pause");
            system("cls");
            break;
 
            case 2:
            print(p, N);
            system("pause");
            system("cls");
            break;
 
            case 3:
            add(&p, &N);
            system("pause");
            system("cls");
            break;
 
            case 4:
            del(&p, &N);
            system("pause");
            system("cls");
            break;
 
            default:
            printf("\nОшибка\n");
            break;
        }
        continue;
    }
    if (NULL == p){
        printf("Недостаточно памяти\n");
        exit(1);
    }
    free(p);
    p = NULL;
}
 
void scan(int** pp, int* pN){
    printf("Введите размер массива: ");
    scanf("%d", pN);
    *pp = (int*) malloc(*pN*sizeof(int));
    if(NULL==*pp){
        printf("Недостаточно памяти\n");
        exit(1);
    }
    int a;
    srand(time(NULL));
    printf("Для автозаполнения нажмите \"1\", для заполнения вручную нажмите \"0\": ");
    scanf("%d", &a);
    if(a==1)
        for (int i=0; i<*pN; ++i)
            (*pp)[i] = rand()%10;
    if(a==0){
        printf("Введите элементы через пробел: ");
        for (int i=0; i<*pN; ++i)
            scanf("%d", &((*pp)[i]));
    }
    for (int i=0; i<*pN; ++i){
        printf("%3d", (*pp)[i] );
    }
    printf("\n");
}
 
void print(int* p, int N)
{
    for (int i=0; i<N; i++)
        printf( "%3d", *(p+i) );
    printf("\n");
}
 
void add(int** pp, int* pN){
    int M, i;
    printf("Введите количество элементов, которые нужно добавить в массив: ");
    scanf("%d", &M);
    *pp = (int*) realloc( *pp, (*pN+M)*sizeof(int) );
    if(NULL==*pp){
        printf("Недостаточно памяти\n");
        exit(1);
    }
    printf("Введите на какое место поставить первый элемент (от 1 до N включительно): ");
    int x;
    scanf("%d", &x);
    printf("Введите значения этих элементов через пробел: ");
    for (i=*pN+M-1; i>=x+M-1; --i) {
        (*pp)[i] = (*pp)[i-M];
    }
    for (int i=x-1; i<x+M-1; ++i) {
        scanf( "%d", &((*pp)[i]) );
    }
    *pN += M;
    for (i=0; i<*pN; ++i){
        printf( "%3d", (*pp)[i] );
    }
    printf("\n");
}
 
void del(int** pp, int* pN){
    int M;
    printf("Введите количество элементов, которые нужно удалить: ");
    scanf("%d", &M);
    if (M <= 0) {
        printf("Число елементов для удаления должно быть больше нуля!\n");
        return;
    }
    if (M > *pN) {
        printf("Число елементов для удаления не должно быть больше чем размер массива!\n");
        return;
    }
    printf("С какого елемента начинать удаление (від 1 до N включительно): ");
    int x;
    scanf("%d", &x);
    if (x < 1 || x > *pN) {
        printf("Можно начинать удаление только від 1 до N включительно!\n");
        return;
    }
    for (int i = x - 1; i < *pN - M; ++i) {
        (*pp)[i] = (*pp)[i+M];
    }
    *pp = (int*) realloc( *pp, (*pN-M)*sizeof(int) );
    if (NULL == *pp){
        printf("Недостаточно памяти\n");
        exit(1);
    }
    *pN -= M;
}
Вывод:
Кликните здесь для просмотра всего текста
Code
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
+======================================+
|1 — создать масив                     |
|--------------------------------------|
|2 — напечатать масив                  |
|--------------------------------------|
|3 — добавить один/несколько элементов |
|--------------------------------------|
|4 — удалить один/несколько элем�нтов  |
|--------------------------------------|
|0 — выход                             |
+======================================+
1
Введите размер массива: 10
Для автозаполнен�я нажмите "1", для заполнения вручную нажмите "0": 1
  2  4  6  0  6  3  7  3  1  5
+======================================+
|1 — создать масив                     |
|--------------------------------------|
|2 — напечатать масив                  |
|--------------------------------------|
|3 — добавить один/несколько элементов |
|--------------------------------------|
|4 — удалить один/несколько элем�нтов  |
|--------------------------------------|
|0 — выход                             |
+======================================+
2
  2  4  6  0  6  3  7  3  1  5
+======================================+
|1 — создать масив                     |
|--------------------------------------|
|2 — напеча�ать масив                  |
|--------------------------------------|
|3 — добавить один/несколько элементов |
|--------------------------------------|
|4 — удалить один/несколько элементов  |
|--------------------------------------|
|0 — выход                             |
+======================================+
3
Введите количест�о элементов, которые нужно добавить в массив: 5
Введите на какое �есто поставить первый элемент (от 1 до N включительно): 1
Введите значения этих элементов через пробел: 51 52 53 54 55
 51 52 53 54 55  2  4  6  0  6  3  7  3  1  5
+======================================+
|1 — создать масив                     |
|--------------------------------------|
|2 — напечатать масив                  |
|--------------------------------------|
|3 — добавить один/несколько элементов |
|--------------------------------------|
|4 — удалить один/несколько элем�нтов  |
|--------------------------------------|
|0 — выход                             |
+======================================+
4
Введите количест�о элементов, которые нужно удалить: 6
С какого елемента начинать удаление (від 1 до N включительно): 10
+======================================+
|1 — создать масив                     |
|--------------------------------------|
|2 — напечатать масив                  |
|--------------------------------------|
|3 — добавить один/несколько элементов |
|--------------------------------------|
|4 — удалить один/несколько элем�нтов  |
|--------------------------------------|
|0 — выход                             |
+======================================+
2
 51 52 53 54 55  2  4  6  0
+======================================+
|1 — создать масив                     |
|--------------------------------------|
|2 — напечатать масив                  |
|--------------------------------------|
|3 — добавить один/несколько элементов |
|--------------------------------------|
|4 — удалить один/несколько элем�нтов  |
|--------------------------------------|
|0 — выход                             |
+======================================+


Добавлено через 2 минуты
Про указатель на указатель я вам вредный совет дал, в данном случае они нужны (значение указателя по-другому в функции не получится изменить, а оно должно меняться т.к. есть вызовы realloc)
2
0 / 0 / 0
Регистрация: 05.03.2023
Сообщений: 17
08.03.2023, 11:56  [ТС]
Цитата Сообщение от Evgen173 Посмотреть сообщение
Вывод:
СПАСИБО ВАМ ОГРОМНОЕ!!! ШЕДЕВР!!! Проверил, все работает так, как задумано; позже буду разбираться в написанном, если не составит труда, подскажите тогда. Просто я не из тех, кто получил ответ и свалил без желания разобраться Еще раз спасибо!
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
08.03.2023, 13:50
Цитата Сообщение от Hats Посмотреть сообщение
И вы все-таки лучше бы запускали код с вашими исправлениями и смотрели как он работает.
Делать мне больше нечего!
Но совет твой учту. В ом смысле, что горбатого могила исправит.

Не по теме:

Бабушка, не дадите ли водицы напиться, а так есть хочется, что даже ночевать негде.


Цитата Сообщение от Hats Посмотреть сообщение
Вот блин, есть же нормальные люди, ответили, полностью все переписали, а мне ответить нормально не могут
Не повезло тебе. На ненормального напал. Ну, жди
Цитата Сообщение от Hats Посмотреть сообщение
Мне давным-давно уже дальше нужно двигаться,
А может быть давно пора понять, что не твое это дело.
1
0 / 0 / 0
Регистрация: 05.03.2023
Сообщений: 17
09.03.2023, 15:27  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
А может быть давно пора понять, что не твое это дело.
Нужно быть исключительным программистом, который понимает все, чтобы, допустим, приняли на работу? Сомневаюсь. Все с чего-то начинают, на то и существуют уровни Trainee, Junior, Middle, Senjor. Я нахожусь на первом уровне. Все видели ошибки в работе какой-нибудь программы, что опровеграет утверждение о том, что нужно все идеально понимать, знать и делать. это желательно, но не обязательно. К тому же, это мое первое обращение на форум. До этого, пусть и с помощью интернета (помощь зала), но все равно обходился без так сказать звонка другу. Очевидно же, что на форум пишут те, кто чего-то не понял. Подумайте, сколько людей покидают форум без решения, сколько людей говорят что поняли, хотя ничего не поняли. Чтобы что-то сделать, нужно иметь пример. Примера правильного кода я не имел, также как и обяснения того как что дожно работать в теории. Я имел лишь код, в котором каждый раз менялись символы, причем не давая ожидаемого результата.

Добавлено через 33 минуты
Цитата Сообщение от Evgen173 Посмотреть сообщение
Про указатель на указатель я вам вредный совет дал
Сейчас я напишу, как я понял действия в программе, а вы скажите, пожалуйста, правильно ли я понимаю. Функция
C
1
void print(int* p, int N)
имеет отличные от других ф-й параметры, я так понимаю чтобы было видно, что формальные и факт. парам. могут оотличаться. Не очень понимаю как все-таки передаются парам. с одной ф-и в другую. Может, они вовсе не передаются, а просто указатель меняет свое значение, и его видно с любого места? Хотя не видно, чтоб указатель pp был в main. Также не понял почему не используется **рр (это же операция, а не указатель, правильно?), а сразу
C
1
*pp = (int*) malloc(*pN*sizeof(int));
. Хотя здесь я могу обяснить это на примере
C
1
int b; int*a; a = &b;
то есть мы "привязываем" рр к выделению памяти под pN. Я наверное говорю неправильными терминами, так что скажите, как правильно это назвать.
0
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
09.03.2023, 16:35
Цитата Сообщение от Hats Посмотреть сообщение
чтобы было видно, что формальные и факт. парам. могут отличаться
Нет, тут это не для вида
C
1
2
3
4
5
6
// p (от pointer) - указатель на начало массива (т.е. адрес начала массива)
// N - копия количества элементов
void print( int* p, int N );       
// pp (от pointer-to-pointer) - указатель на указатель на начало массива
// pN - указатель на переменную, содержащую количество элементов в массиве
void scan( int** pp, int* pN );
Отличие тут в том, что функция print получит адрес массива: она сможет читать и записывать элементы массива при необходимости, также функция знает о количестве элементов N. Но данная функция не может поменять сам адрес начала массива (потому что в функцию print приходит копия указателя), а также не может изменить размер массива N (в функцию приходит копия N из основной программы).
К функции scan требования другие - она должна изменять сам адрес начала массива (до вызова функции он NULL, а после должен быть валидным), а также количество элементов N в массиве. Чтобы мы могли менять значения, нам нужны их адреса, в противном случае мы будем менять только копии значений в функции, что нас не устраивает. Поэтому в scan появляется указатель на указатель и указатель на размер массива.
По поводу строки *pp = (int*) malloc(*pN*sizeof(int));. pp - это указатель на указатель на int, или int**. Функция malloc возвращает указатель, который мы приводим к типу int*. Для успешного присваивания типы значений слева и справа должны совпадать, у нас же сейчас int** = int* Чтобы из int** получить int*, нужно разыменовать указатель pp, так мы и получаем *pp
2
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
09.03.2023, 16:50
Evgen173, об о всем об этом уже было тылдычено на протяжении 26 постов (4-х дней). Но моих слов ТС не понял. Может быть твои поймет? Дай-то Бог!
0
0 / 0 / 0
Регистрация: 05.03.2023
Сообщений: 17
10.03.2023, 02:32  [ТС]
Спасибо, примерно понял. Со временем с оптом думаю придет полное понимание. Всем спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.03.2023, 02:32

Передача двухмерного динамического массива в функцию
Честно говоря пересмотрел многие форумы и темы но так и не понял как это сделать. Как передать двухмерный (обычный) массив мне понятно но...

Передача динамического двухмерного массива в функцию
Как передать этот динамический массив в функцию? int main() { int *a; int m=3, n=3,s=0; a = (int *)malloc(n*m *...

Передача двумерного динамического массива в функцию через указатель
Всем привет! Собственно сабж. Я почитал о том, как это делать, но слишком много случаев показано именно для c++ и без вывода этого массива...

Передача динамического массива как аргумент функции
Вот кусок кода. Если разкомментировать вывод элементов массива на экран в main, то происходит ошибка сегментирования. Из-за того, что я...

Передача динамического массива в функцию
Пытаюсь научиться передавать массив в функцию. Я уже знаю что вместо массива передаётся указатель на массив. Щас вроде компилируется, но...


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru