Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 26.05.2013
Сообщений: 16
1

Передача указателя на элемент массива в функцию

12.06.2014, 14:13. Показов 1785. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрых времени суток)
Есть массив, самый обычный. Нужно передвинуть влево все значения, кроме последнего (ибо мусор нам не нужен). Т.е. если был массив {0,1,2,3}, то должен стать {1,2,3,3}. При этом все махинации нужно проводить с указателями. И вот тут-то возникло пару вопросов.

Собственно, непонятки именно с указателями. (см. код ниже) Если мы передаем адресс &а[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
#include <iostream>
using namespace std;
 
void less_12_1(int*, int []); //объявляем нашу функцию (int [] эквивалентно int*, насколько понимаю)
int a[6]={0,1,2,3,4,5}; //создаем массив
int *pa=&a[1];  //начинаем не с первого элемента, так что берём адрес второго (т.е. двигаемся с 1)
 
int main()
{
    bool flag=true; 
    int n;  
    while(flag)
    {
        system("clear");
        cout<<"1\t3\t\n2\t4 Exit\n"<<endl;
        cin>>n;
        system("clear");
        switch(n)
        {
            case 1: less_12_1(pa, &a[6]);break; // тут упаковываем адрес первого нужного элемента и последнего
            
            //case 2: less_12_2(); break;
            //case 3: less_12_3(); break;
 
            case 4: flag=false; break;
        }
    }
    return 0;
}
 
void less_12_1(int pa,int *a) // вот тут очень смущает *а, т.к. это, по идее, ссылка на первый элемент. 
{
    for (; pa!=&a[6]; pa++) // тут я хочу повторять цикл до тех пор, пока адрес ра не совпадет с адресом a[6],
                 //но получаю: ISO C++ forbids comparison between pointer and integer [-fpermissive] 
    {
        pa=(pa+1); 
        cout<<pa;
    }
}
И насчет for (; pa!=&a[6]; pa++) . Почему нельзя сравнивать? Ведь техничесики, что там адрес, что там. И указатель типа int, и массив типа int. В чем подвох?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.06.2014, 14:13
Ответы с готовыми решениями:

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

Ошибка при передаче в функцию указателя на элемент массива
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;cstdlib&gt; #include &lt;cmath&gt; ...

Передача указателя на шаблонную функцию в другую функцию
Пишу тест для нескольких улучшений квиксорта с измерением времени. Функция benchmark принимает...

Передача указателя на функцию
Есть класс в котором: typedef void(*setChar)(int x, int y, wchar_t c); void...

10
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
12.06.2014, 14:28 2
Цитата Сообщение от BalexD Посмотреть сообщение
И насчет for (; pa!=&a[6]; pa++) . Почему нельзя сравнивать? Ведь техничесики, что там адрес, что там. И указатель типа int, и массив типа int. В чем подвох?
подвох в том что там не указатель на int, а int
Цитата Сообщение от BalexD Посмотреть сообщение
C
1
void less_12_1(int pa,int *a)
Добавлено через 1 минуту
Цитата Сообщение от BalexD Посмотреть сообщение
pa=(pa+1);
* * * * cout<<pa;
может так:
C
1
2
*pa = *(pa+1);
cout << *pa;
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
12.06.2014, 14:30 3
Цитата Сообщение от BalexD Посмотреть сообщение
less_12_1
Почему бы человеческие названия не давать программным сущностям?
0
0 / 0 / 0
Регистрация: 26.05.2013
Сообщений: 16
12.06.2014, 14:35  [ТС] 4
Цитата Сообщение от Jewbacabra Посмотреть сообщение
может так:
Код C
1
2
*pa = *(pa+1);
cout << *pa;
Ох, нет. У меня так было -- выдавалась ошибка invalid type argument of unary ‘*’ (have ‘int’). Да икомпилятор тыкает-то именно в сравнение.

Цитата Сообщение от Tulosba Посмотреть сообщение
Почему бы человеческие названия не давать программным сущностям?
Это только кусок домашнего задания. Там 19 уроков -- в каждом по три-четыре задания. Так что это, скорее, из соображений удобств)
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
12.06.2014, 14:36 5
BalexD, еще раз:
Цитата Сообщение от Jewbacabra Посмотреть сообщение
void less_12_1(int pa,int *a)
ничего не замечаешь?
0
0 / 0 / 0
Регистрация: 26.05.2013
Сообщений: 16
12.06.2014, 14:39  [ТС] 6
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Цитата Сообщение от Jewbacabra Посмотреть сообщение
void less_12_1(int pa,int *a)
ничего не замечаешь?
Ну как я поняла, что с int pa все верно. А вот с *а я могу только предположить варианты с &a или просто а. К сожалению, тут вынуждены попросить тыкнуть носом. )
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
12.06.2014, 14:41 7
Цитата Сообщение от BalexD Посмотреть сообщение
Ну как я поняла, что с int pa все верно.
Нет.
сама же пишешь:
Цитата Сообщение от BalexD Посмотреть сообщение
И указатель типа int, и массив типа int
И еще сравни прототип:
C
1
void less_12_1(int*, int []);
И реализацию:
C
1
void less_12_1(int pa,int *a)
И как говориться найди 10 отличий
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
12.06.2014, 14:41 8
Цитата Сообщение от BalexD Посмотреть сообщение
К сожалению, тут вынуждены попросить тыкнуть носом. )
C++
1
2
void less_12_1(int*, int []); // прототип
void less_12_1(int pa,int *a) // реализация
Разницу видим?
Цитата Сообщение от BalexD Посмотреть сообщение
Так что это, скорее, из соображений удобств)
Очень печально, что имена такого вида воспринимаются как удобные.
0
0 / 0 / 0
Регистрация: 26.05.2013
Сообщений: 16
12.06.2014, 14:46  [ТС] 9
Цитата Сообщение от Jewbacabra Посмотреть сообщение
И как говориться найди 10 отличий
Ох, черт! Какая глупая ошибка.Ну, теперь я хотя-бы могу посмотреть, работает ли она так, как я хочу. Спасибо за помощь)

Цитата Сообщение от Tulosba Посмотреть сообщение
Очень печально, что имена такого вида воспринимаются как удобные.
Ну мы ж не уточням, кому именно они должны быть удобны)
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
12.06.2014, 14:56 10
Цитата Сообщение от BalexD Посмотреть сообщение
Ну мы ж не уточням, кому именно они должны быть удобны)
Они должны быть удобны для того, кто использует код. А так как Вы общаетесь на форум за помощью, то этот код приходится использовать не только Вам.
0
0 / 0 / 0
Регистрация: 26.05.2013
Сообщений: 16
12.06.2014, 15:07  [ТС] 11
Цитата Сообщение от Tulosba Посмотреть сообщение
Они должны быть удобны для того, кто использует код. А так как Вы общаетесь на форум за помощью, то этот код приходится использовать не только Вам.
Мне показалось необязательным переименовывать одну-единственную функцию на весь код.) Но учту и это.
0
12.06.2014, 15:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.06.2014, 15:07
Помогаю со студенческими работами здесь

Передача указателя в функцию
Поиском не пользовался, возможно данный вопрос уже проскакивал. Проблема том, что VS2010 на отрез...

передача указателя на функцию
Помогите исправить ошибку уже незнаю как быть В бивает ту ошибку error C2664: Generate:...

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

Передача в функцию указателя
Почему плохо передавать в функцию указатель на строку или массив и возвращать указатель на строку...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru