Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
BalexD
0 / 0 / 0
Регистрация: 26.05.2013
Сообщений: 16
#1

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

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

Добрых времени суток)
Есть массив, самый обычный. Нужно передвинуть влево все значения, кроме последнего (ибо мусор нам не нужен). Т.е. если был массив {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. В чем подвох?
http://www.cyberforum.ru/cpp-beginners/thread911533.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2014, 14:13
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Передача указателя на элемент массива в функцию (C++):

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

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

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

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

Передача указателя на функцию
Доброго дня Форумчане. Хотелось бы узнать как вызывать функцию получив на нее...

10
Jewbacabra
Эксперт PHP
3088 / 2675 / 1222
Регистрация: 24.04.2014
Сообщений: 8,188
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
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
12.06.2014, 14:30 #3
Цитата Сообщение от BalexD Посмотреть сообщение
less_12_1
Почему бы человеческие названия не давать программным сущностям?
0
BalexD
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
Jewbacabra
Эксперт PHP
3088 / 2675 / 1222
Регистрация: 24.04.2014
Сообщений: 8,188
12.06.2014, 14:36 #5
BalexD, еще раз:
Цитата Сообщение от Jewbacabra Посмотреть сообщение
void less_12_1(int pa,int *a)
ничего не замечаешь?
0
BalexD
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
Jewbacabra
Эксперт PHP
3088 / 2675 / 1222
Регистрация: 24.04.2014
Сообщений: 8,188
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
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 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
BalexD
0 / 0 / 0
Регистрация: 26.05.2013
Сообщений: 16
12.06.2014, 14:46  [ТС] #9
Цитата Сообщение от Jewbacabra Посмотреть сообщение
И как говориться найди 10 отличий
Ох, черт! Какая глупая ошибка.Ну, теперь я хотя-бы могу посмотреть, работает ли она так, как я хочу. Спасибо за помощь)

Цитата Сообщение от Tulosba Посмотреть сообщение
Очень печально, что имена такого вида воспринимаются как удобные.
Ну мы ж не уточням, кому именно они должны быть удобны)
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
12.06.2014, 14:56 #10
Цитата Сообщение от BalexD Посмотреть сообщение
Ну мы ж не уточням, кому именно они должны быть удобны)
Они должны быть удобны для того, кто использует код. А так как Вы общаетесь на форум за помощью, то этот код приходится использовать не только Вам.
0
BalexD
0 / 0 / 0
Регистрация: 26.05.2013
Сообщений: 16
12.06.2014, 15:07  [ТС] #11
Цитата Сообщение от Tulosba Посмотреть сообщение
Они должны быть удобны для того, кто использует код. А так как Вы общаетесь на форум за помощью, то этот код приходится использовать не только Вам.
Мне показалось необязательным переименовывать одну-единственную функцию на весь код.) Но учту и это.
0
12.06.2014, 15:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.06.2014, 15:07
Привет! Вот еще темы с решениями:

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

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

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

Передача в функцию указателя на указатель
Добавление нового элемента в начало списка: void Add_Beg(List **u, Data &amp;x) //...


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

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

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