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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Jack Wade
63 / 36 / 6
Регистрация: 24.02.2013
Сообщений: 250
#1

Не вводятся элементы в массив(указатели) - C++

11.10.2013, 15:29. Просмотров 380. Ответов 12
Метки нет (Все метки)

Здравствуйте! У меня возникла проблема с указателями...
Я хочу сделать функцию, которая организует ввод данных в статический массив, и функцию с выводом введённого массива.
Когда я пишу простую функцию на подобии ниже представленной:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void standart_see_massive(int m[], int size)
{
    for (int i=0; i<size; i++) printf("%d\n", m[i]);
}
 
void standart_enter_massive(int m[], int size)
{
    for (int i=0; i<size; i++) scanf("%d", &m[i]);
}
 
...
 
int main(void)
{
standart_enter_massive(&massive[10], 10);
printf("%d\n", massive[4]);//Например-нужно просмотреть 5-й элемент массива

В данном случае-значение не заносится...
Думал, через указатели сделать-но не вышло...
Весь код программы:
Кликните здесь для просмотра всего текста

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
#include "stdafx.h"
#include <stdio.h>
 
void see_string(char *str)
{
    while(*str!='\0') printf("%c", *str++);
}
 
void enter_massive(int *m, int n)
{
    for (int i=0; i<n; i++)
    {
        scanf("%d", &m);
        *m++;
    }
}
 
void see_massive(int m[], int n)
{
    for (int i=0; i<n; i++)
    {
        printf("%d\n", &m);
        *m++;
    }
}
 
void standart_see_massive(int m[], int size)
{
    for (int i=0; i<size; i++) printf("%d\n", m[i]);
}
 
void standart_enter_massive(int m[], int size)
{
    for (int i=0; i<size; i++) scanf("%d", &m[i]);
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    printf("STANDART FUNCTION\n");
    int mas[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    standart_see_massive(mas, 10);
    printf("\n\n\n");
    printf("STANDART ENTER MASSIVE\n");
    standart_enter_massive(&mas[10], 10);
    printf("=====%d\n", mas[4]);
    printf("\n\n\n");
    printf("UK FUNCTION SEE TEXT\n");
    see_string("Hello world!");
    printf("\n\n\n");
    printf("UK FUNCTION ENTER MASSIVE\n");
    enter_massive(&mas[10], 10);
    printf("\n\n\n");
    printf("UK FUNCTION SEE MASSIVE\n");
    see_massive(mas, 10);
    printf("\n\n\n");
    _gettch();
    
    return 0;
}

Если создавать динамические массивы, можно просто сделать след. функцию, и присваивать наш динам. массив=значению данной функции:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
int* enter_dynamic_massive(int size)
{
int* mas=new int[size];
for (int i=0; i<size; i++) scanf("%d", mas[i]);
return mas;
}

Однако, я ни как не могу понять, как это сделать с статическим массивом...
Помогите пожалуйста... Или, помогите разобраться с указателями, если не трудно...
P.S. Читал про указатели, вроде бы, как понял, а вот на практике, ничего дальше, как просто вывод текста так сделать и не смог(это был пример работы с указателями)...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.10.2013, 15:29     Не вводятся элементы в массив(указатели)
Посмотрите здесь:

Как в массив скопировать массив, который заполнен через указатели - C++
Есть два файла допусти. Суть вопроса в том, что находится во втором файле. Как записать? car.h struct car { float massiv; ...

Задача на массив и указатели.(массив из случайных чисел) - C++
Найти абсолютное значение,которое чаще остальных встречается в массиве. #include&lt;stdio.h&gt; #include&lt;time.h&gt; #include&lt;stdlib.h&gt; ...

Указатели и элементы класса - C++
Суть проблемы: есть класс neuro. в нём есть элемент данных double *inputs; // входыесть независимый от первого класс auction в нём...

указатели на элементы класса - C++
Здравствуйте! есть код: class A { public: void C(void){return;} static int D(void){return 0;} int a;

Просуммировать элементы массива используя указатели - C++
III. Создайте 5 елементный статический массив переменных типа int и заполните его произвольными значениями. Затем создайте указатель,...

Напишите программу, которая заполняет массив из 15 элементов. Данные вводятся с клавиатуры. - C++
1. Напишите программу, которая заполняет массив из 15 элементов. Данные вводятся с клавиатуры.

Одномерные массивы (векторы): вычислить и напечатать значения функции Y= Ak2 + Ak - sin Ak, где элементы массива А вводятся с клавиатуры - C++
Вычислить и напечатать значения функции Y= Ak2 + Ak - sin Ak где элементы массива А вводятся с клавиатуры .

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Raali
622 / 326 / 34
Регистрация: 06.07.2013
Сообщений: 1,054
Завершенные тесты: 1
11.10.2013, 15:35     Не вводятся элементы в массив(указатели) #2
Цитата Сообщение от Jack Wade Посмотреть сообщение
standart_enter_massive(&massive[10], 10);
нужно брать адрес начала массива "massive" или "&massive[0]"

Добавлено через 3 минуты
Цитата Сообщение от Jack Wade Посмотреть сообщение
standart_see_massive(mas, 10);
тут почему то ты делаешь все правильно
Ilot
Модератор
Эксперт С++
1789 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
11.10.2013, 15:39     Не вводятся элементы в массив(указатели) #3
Когда я пишу простую функцию на подобии ниже представленной:
C++
1
standart_enter_massive(&massive[10], 10);
Тута вы передаете указательна 10й элемент и заполняются адреса лежащие за областью выделенной для массива. Нужно так:
C++
1
standart_enter_massive(massive, 10);
И еще меня смущает вот это:
C++
1
*m++;
На самом деле имя массива константа ее нельзя изменить. Если я не ошибаюсь приоритет операции * выше ++, а значит в этом коде вы увеличиваете первый элемент массива, а не переходите к следующему члену. Хотя возможно я ошибаюсь...
Jack Wade
63 / 36 / 6
Регистрация: 24.02.2013
Сообщений: 250
11.10.2013, 15:42  [ТС]     Не вводятся элементы в массив(указатели) #4
Raali, можно подробнее?
Вот, допустим я сделал след. функцию:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void enter_massive(int m[], int size)
{
    for (int i=0; i<size; i++)
    {
        scanf("%d", &m);
        *m++;//-переход к след. элементу
    }
}
 
...
 
enter_massive(&mas[0], 10);//Так я пытаюсь передать массив, как параметр, но так, что бы можно было бы и изменить само содержание массива
//Как я понял-вы говорили, что бы я отправил параметр &mas[0], однако, значение всех элементов -80****** с чем то, взамен стандартных 10,9,8,7....

Подскажите пожалуйста, что я делаю не так?

Добавлено через 1 минуту
Ilot, передавал так же параметр, и точно такой же был результат...
Raali
622 / 326 / 34
Регистрация: 06.07.2013
Сообщений: 1,054
Завершенные тесты: 1
11.10.2013, 15:54     Не вводятся элементы в массив(указатели) #5
все куда проще

C++
1
2
3
4
5
6
7
void enter_massive(int m[], int size)
{
for (int i=0; i<size; i++)
{
scanf("%d", &m[i]);
}
}
Добавлено через 2 минуты
Цитата Сообщение от Jack Wade Посмотреть сообщение
scanf("%d", &m);
m - это адрес первого элемента массива
делая это scanf("%d", &m) - значение с клавиатуры заменит не элемент массива - а его адрес, то есть переменную в которой хранится его адрес

Добавлено через 2 минуты
Цитата Сообщение от Jack Wade Посмотреть сообщение
*m++;//-переход к след. элементу
это тоже не переход к след. элементу массива
если m - это адрес первого элемента
то *m - это сам первый элемент
тут увеличивается именно значение первого элемента на 1
Jack Wade
63 / 36 / 6
Регистрация: 24.02.2013
Сообщений: 250
11.10.2013, 15:54  [ТС]     Не вводятся элементы в массив(указатели) #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
#include "stdafx.h"
#include <stdio.h>
#include <Windows.h>
 
void see_string(char *str)
{
    while(*str!='\0') printf("%c", *str++);
}
 
void enter_massive(int m[], int size)
{
    for (int i=0; i<size; i++) scanf("%d", &m[i]);
}
 
void print_massive(int m[], int size)
{
    for (int i=0; i<size; i++) printf("[%3d] = %3d\n", i+1, m[i]);
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    int mas[10];
    SetConsoleOutputCP(1251);
 
    see_string("Пример текста для работы с указателями!\n");
 
    enter_massive(mas, 10);
    print_massive(mas, 10);
 
    for (int i=0; i<10; i++) printf("%d\n", mas[i]);
 
    _gettch();
 
    return 0;
}
Stepler
14 / 14 / 0
Регистрация: 27.11.2007
Сообщений: 132
11.10.2013, 15:55     Не вводятся элементы в массив(указатели) #7
Нужно вот так
C++
1
2
3
4
5
6
7
8
void enter_massive(int m[], int size)
{
    for (int i=0; i<size; i++)
    {
        scanf("%d", &m[0]);       
    m++;
    }
}
Ilot
Модератор
Эксперт С++
1789 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
11.10.2013, 16:15     Не вводятся элементы в массив(указатели) #8
Цитата Сообщение от Raali Посмотреть сообщение
это тоже не переход к след. элементу массива
если m - это адрес первого элемента
то *m - это сам первый элемент
тут увеличивается именно значение первого элемента на 1
Методом научного тыка выяснилось, что приоритет операции ++ выше *, а значит *m++ это переход к следующему элементу. Печалька.
А от сюда вопрос. Почему компилитор не ругается на этот код?
C++
1
2
3
4
5
6
7
8
void see_massive(int m[], int n)
{
    for (int i=0; i<n; i++)
    {
        printf("%d\n", &m);
        *m++;//<--тута
    }
}
Raali
622 / 326 / 34
Регистрация: 06.07.2013
Сообщений: 1,054
Завершенные тесты: 1
11.10.2013, 16:23     Не вводятся элементы в массив(указатели) #9
Цитата Сообщение от Ilot Посмотреть сообщение
Почему компилитор не ругается на этот код?
Цитата Сообщение от Ilot Посмотреть сообщение
*m++;//<--тута
а почему нельзя брать следующий элемент массива и ничего с ним не делать ?)
странно только то , что программа в рантайме не вылетела из за ввода m, и последующего разыменовывания
Ilot
Модератор
Эксперт С++
1789 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
11.10.2013, 16:29     Не вводятся элементы в массив(указатели) #10
Цитата Сообщение от Raali Посмотреть сообщение
а почему нельзя брать следующий элемент массива и ничего с ним не делать ?)
Ну как же - имя массива это константный указатель его нельзя инкрементировать. По приоритетам все работает так *(m++). Складывается впечатление, что в ф-ю передается не сам указатель, а адрес массива и поэтому он спокойненько инкрементируется. Старанно...
Raali
622 / 326 / 34
Регистрация: 06.07.2013
Сообщений: 1,054
Завершенные тесты: 1
11.10.2013, 16:31     Не вводятся элементы в массив(указатели) #11
Цитата Сообщение от Ilot Посмотреть сообщение
see_massive(int m[], int n)
тут функция и принимает m как указатель на массив int
Ilot
Модератор
Эксперт С++
1789 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
11.10.2013, 16:38     Не вводятся элементы в массив(указатели) #12
Цитата Сообщение от Raali Посмотреть сообщение
тут функция и принимает m как указатель на массив int
Ага уже разобрался.
Люблю этот форум за то что можно учится не на своих ошибках, а на чужих.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.10.2013, 16:41     Не вводятся элементы в массив(указатели)
Еще ссылки по теме:

Указатели: сдвинуть элементы циклически на 1 позицию влево - C++
Условие задачи: Заполните случайным образом одномерный массив из n элементов и здвиньте элементы циклически на 1 позицию влево. (Например...

Поменять элементы массива местами используя указатели - C++
Указатель не должен менять своего значения

Вывести на экран элементы массива используя указатели - C++
здравстуйте!Создать одномерный массив состоящий из случайных целых чисел. Вывести на экран элементы массива используя указатели без прямого...

Скопировать чётные элементы из массива X в массив Y, а нечётные элементы в массив Z - C++
Ребята помогите пожалуиста скопировать четные елементы из масива X в масив Y и нечетные елементы в масив Z. Я использою Дев С++. ...

Переписать в массив Y положительные элементы а в массив Z отрицательные элементы массива Х N<=40 - C++
Помогите уважаемые программисты Нужно написать программу &quot;X(N) Переписать в массив Y положительные элементы а в массив Z отрицательные...


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

Или воспользуйтесь поиском по форуму:
Raali
11.10.2013, 16:41     Не вводятся элементы в массив(указатели)
  #13

Не по теме:

Цитата Сообщение от Ilot Посмотреть сообщение
Люблю этот форум за то что можно учится не на своих ошибках, а на чужих
аналогично ) (*m++)

Yandex
Объявления
11.10.2013, 16:41     Не вводятся элементы в массив(указатели)
Ответ Создать тему
Опции темы

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