Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
dleen
65 / 3 / 2
Регистрация: 01.07.2014
Сообщений: 38
#1

Можно ли передать в функцию указатель на константу? - C (СИ)

30.07.2014, 12:17. Просмотров 1368. Ответов 7
Метки нет (Все метки)

Задача: Напишите функцию обнуления массива. В функцию необходимо передавать указатель на массив и его размер.

Проблема: Указатель на константу (строка 22) передаваться не хочет.

Вопрос: можно/нужно ли в принципе и если да то как передавать указатель на константу в функцию?

Решение №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
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <time.h>
#include <stdlib.h>
void zero (int*,int*);
 
int main ()
 
{
    const int n = 10;
    int i, x[n], m;
    setlocale (0, "russian");
    srand (time(NULL));
//  m=n;
    for (i=0;i<n;i++)
        {
            x[i]=rand ()%100;
            printf ("x[%d]=%d\n", i, x[i]);
        }
    puts ("");
    zero (x,&n);
 
    for (i=0;i<n;i++)
        {
            printf ("x[%d]=%d\n", i, x[i]);
        }
 
 
        getch ();
            return 0;
}
 
void zero (int *ptr_mas, int *ptr_r) //функция обнуления массива
    {
        int i;
        for (i=0;i<*ptr_r;i++)
            {
                ptr_mas[i]=0;
            }
    }

Решение №2 (работает через костыль):

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
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <time.h>
#include <stdlib.h>
void zero (int*,int*);
 
int main ()
 
{
    const int n = 10;
    int i, x[n], m;
    setlocale (0, "russian");
    srand (time(NULL));
    m=n; //костыль
    for (i=0;i<n;i++)
        {
            x[i]=rand ()%100;
            printf ("x[%d]=%d\n", i, x[i]);
        }
    puts ("");
    zero (x,&m); //костыль
 
    for (i=0;i<n;i++)
        {
            printf ("x[%d]=%d\n", i, x[i]);
        }
 
 
        getch ();
            return 0;
}
 
void zero (int *ptr_mas, int *ptr_r) //функция обнуления массива
    {
        int i;
        for (i=0;i<*ptr_r;i++)
            {
                ptr_mas[i]=0;
            }
    }

http://www.cyberforum.ru/c-beginners/thread707781.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2014, 12:17
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Можно ли передать в функцию указатель на константу? (C (СИ)):

Передать указатель из одной вызываемой функцию в другую
Прошу помощи. Надо указатель передать в одну функции(f1), а потом из этой...

Как передать указатель функции в другую функцию?
Добрый вечер.:) Кто нибудь знает как передать указатель функции в другую? ...

Указатель на массив констант. Как передать в функцию?
С наступающим! Нужно передать указатель на stule_a(b) в функцию. А из функций...

Возможно ли передать в функцию указатель на массив структур?
Ниже написан работающий код: #include &lt;stdio.h&gt; #include &lt;wchar.h&gt; #include...

Можно ли передать функцию как аргумент другой функции?
mojno li v iazike C peredati functiiu kak argument drugoi functii. sori za...

7
Docker1
3 / 3 / 2
Регистрация: 21.04.2013
Сообщений: 14
30.07.2014, 12:44 #2
Лучший ответ Сообщение было отмечено SatanaXIII как решение

Решение

А если так?
C
1
void zero (int* ptr_mas, const int* ptr_r)
и затем
C
1
zero (x,&n);
1
dleen
65 / 3 / 2
Регистрация: 01.07.2014
Сообщений: 38
30.07.2014, 12:50  [ТС] #3
Docker1, вы открыли мне глаза. Спасибо! )
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,230
31.07.2014, 15:47 #4
dleen, у Вас просто мания какая-то использовать указатели везде, где нужно и не нужно. Зачем длину массива передавать в функцию через указатель?
По сути, если функция memset() Вам по каким-либо причинам не подходит (а для обнуления массива её как-раз удобно использовать, удобнее разве-что bzero() но это не стандартная функция С), ну сделайте что-то вроде
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>
 
void fill(int * array, size_t count, const int value) {
    while ( count-- )
        *array++ = value;
}
 
void dump(const int * array, size_t count) {
    while ( count-- )
        printf("%d%c", *array++, ( count ) ? ' ' : '\n');
}
 
#define COUNT 10
 
int main(void) {
    int arr[COUNT];
 
    fill(arr, COUNT, 0);
    dump(arr, COUNT);
 
    return 0;
}
2
castorsky
1973 / 1076 / 87
Регистрация: 29.11.2013
Сообщений: 3,354
01.08.2014, 01:40 #5
easybudda, Стивенс же
C
1
2
3
4
5
6
/* Define bzero() as a macro if it's not in standard C library. */
#ifndef HAVE_BZERO
#define bzero(ptr,n)            memset(ptr, 0, n)
/* $$.If bzero$$ */
/* $$.If memset$$ */
#endif
0
skident
23 / 23 / 6
Регистрация: 11.12.2011
Сообщений: 300
15.08.2014, 16:35 #6
Ну так зачем там и вправду указатель !? Раз решили экономить на памяти, то передавайте по ссылке

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
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <time.h>
#include <stdlib.h>
void zero (int*,const int&);
 
int main ()
 
{
    const int n = 10;
    int i, x[n], m;
    setlocale (0, "russian");
    srand (time(NULL));
//  m=n;
    for (i=0;i<n;i++)
        {
            x[i]=rand ()%100;
            printf ("x[%d]=%d\n", i, x[i]);
        }
    puts ("");
    zero (x,n);
 
    for (i=0;i<n;i++)
        {
            printf ("x[%d]=%d\n", i, x[i]);
        }
 
 
        getch ();
            return 0;
}
 
void zero (int *ptr_mas, const int& ptr_r) //функция обнуления массива
    {
        int i;
        for (i=0;i< ptr_r;i++)
            {
                ptr_mas[i]=0;
            }
    }
0
Вованя
137 / 134 / 63
Регистрация: 20.02.2014
Сообщений: 478
Завершенные тесты: 1
15.08.2014, 18:39 #7
skident, это в ваших крестах можно по ссылке, а в Сишечке только по указателю.
0
skident
23 / 23 / 6
Регистрация: 11.12.2011
Сообщений: 300
15.08.2014, 20:50 #8
Вованя, ой вей, не заметил, что код С-ишный. Тогда все как уже говорили выше - надо добавить модификатор const либо вообще отказаться от передачи указателя.
0
15.08.2014, 20:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2014, 20:50
Привет! Вот еще темы с решениями:

Передать указатель на структуру в параметре функции
Есть структура struct Test{ BYTE Size; BYTE* Mass; }; На чистом Си...

Как передать в подпрограмму указатель на двумерный массив?
как передать в подпрограмму указатель на двумерный массив???

Как передать в подпрограмму указатель на i-тый элемент массива
Итак, есть главная программа, есть подпрограмма, в главной программе...

Как передать возвращаемое значение в функции getY через указатель
Добрый вечер. Подскажите, как передать возвращаемое значение в функции getY...


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

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

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