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

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

Восстановить пароль Регистрация
 
Jack Wade
61 / 34 / 6
Регистрация: 24.02.2013
Сообщений: 250
11.10.2013, 15:29     Не вводятся элементы в массив(указатели) #1
Здравствуйте! У меня возникла проблема с указателями...
Я хочу сделать функцию, которая организует ввод данных в статический массив, и функцию с выводом введённого массива.
Когда я пишу простую функцию на подобии ниже представленной:
Кликните здесь для просмотра всего текста

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++
Дан массив. Переписать его второй, четвертый и т.д. элементы в другой массив такого же размера, расположив элементы подряд с начала массива C++
C++ Задача на массив и указатели.(массив из случайных чисел)
C++ указатели на элементы класса
C++ Массив и указатели. Вывести на экран весь массив и на отдельной строке - значение минимального элемента массива
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 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
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 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
61 / 34 / 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
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 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
61 / 34 / 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
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 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
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
11.10.2013, 16:23     Не вводятся элементы в массив(указатели) #9
Цитата Сообщение от Ilot Посмотреть сообщение
Почему компилитор не ругается на этот код?
Цитата Сообщение от Ilot Посмотреть сообщение
*m++;//<--тута
а почему нельзя брать следующий элемент массива и ничего с ним не делать ?)
странно только то , что программа в рантайме не вылетела из за ввода m, и последующего разыменовывания
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
11.10.2013, 16:29     Не вводятся элементы в массив(указатели) #10
Цитата Сообщение от Raali Посмотреть сообщение
а почему нельзя брать следующий элемент массива и ничего с ним не делать ?)
Ну как же - имя массива это константный указатель его нельзя инкрементировать. По приоритетам все работает так *(m++). Складывается впечатление, что в ф-ю передается не сам указатель, а адрес массива и поэтому он спокойненько инкрементируется. Старанно...
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
11.10.2013, 16:31     Не вводятся элементы в массив(указатели) #11
Цитата Сообщение от Ilot Посмотреть сообщение
see_massive(int m[], int n)
тут функция и принимает m как указатель на массив int
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 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     Не вводятся элементы в массив(указатели)
Еще ссылки по теме:

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

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

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

Не по теме:

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

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

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