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

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

Войти
Регистрация
Восстановить пароль
 
grrrrr
45 / 45 / 7
Регистрация: 21.04.2009
Сообщений: 265
#1

Возврат из функции другого адреса - C++

13.03.2011, 23:18. Просмотров 606. Ответов 3
Метки нет (Все метки)

Собственно сабж. Есть функция - поиска минимального элемента с помощью указателей.
Функция возвращает другой адрес, почему? Ведь в функции указателю min_element присваиваю адрес массива arr. Помогите разобраться. Спасибо.

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
#include <iostream>
 
using namespace std;
 
int * min(int *A, int size);
 
int main()
{
    const int s=10;
    int arr[s] = {7,5,3,8,-1,9,1,6,8,4}, *p;
    
    p=arr;
    p=min(arr,s);
    
    //cout << *p << "\n";
    //cout << "address p = " << p << "\n";
    //cout << "address arr = " << arr << "\n\n\n";
    for(int i=0; i<10; i++)
        cout << "addredd arr[" << i <<"] == " << &arr[i] << "\n";
    cout << "\n\n";
    for(int i=0; i<10; i++)
        cout << "addredd p[" << i <<"] == " << &p[i] << "\n";
    
    return 0;
}
int * min(int *A, int size)
{
    int *min_element;
    
    min_element=A;      
    min_element = &A[0];
    for(int i=1; i<size; i++)
        if(A[i] < *min_element) 
               min_element = &A[i];         
    
    return min_element;
}
Добавлено через 13 минут
Извените если не правильно сказал, имелось ввиду, что функция возвращает верное значение, но я сравниваю также и адреса. Так вот, адрес минимального элемента массива arr отличается от адреса массива р.

Добавлено через 20 минут
неужели ни кто не подскажет?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.03.2011, 23:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Возврат из функции другого адреса (C++):

Возврат копии структуры из другого класса - C++
Как можно копию структуры из одного класса передать в другой? (именно чтоб она изначально в private была) Сам только до такой вариант...

Возврат 2 значений из функции с одним вызовом этой же функции - C++
Вообщем где то в какой то игре была хукнута одна функция int function(int arg1,int arg2,int arg3); суть в чем int...

Возврат значения функции - C++
Что такое возврат значения функции? я уже всю голову изломал, что и куда возвращается? в гугле нашёл мол возвращается результат (куда? в...

Возврат структуры из функции - C++
Добрый день! Я только начинаю, и сразу стал путаться с массивами и структурами с горем попалам понял как их передавать в функции....

Возврат массива из функции - C++
Здравствуйте. Не могу разобраться, почему при передачи массива из функции но не правильно передаётся. Вот результат.

Возврат массива из функции - C++
Есть задача: используя функции, вычислить количество элементов заранее введённых массивов, которые кратны Х, и переписать в отдельный...

3
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
13.03.2011, 23:18 #2
grrrrr, если я правильно понял вашу проблему, то так. После вызова min() ваш int * p будет указывать на элемент массива arr, у которого минимальное значение. А этот элемент ведь находится не в начале массива, вот и адрес у него другой. Смотрите, вот массив в памяти:

00 00 00 07
00 00 00 05
00 00 00 03
00 00 00 08
FF FF FF FF
00 00 00 09
00 00 00 01
00 00 00 06
00 00 00 08
00 00 00 04


FF FF FF FF - это -1 в шестнадцатеричной записи. Почему так - отдельный вопрос. Если будет интересно - спросите, не хочу сейчас на это отвлекаться. В общем, он - минимальный. Вот что у вас получается после вызова min():

00 00 00 07 <<< НАЧАЛО МАССИВА ЗДЕСЬ
00 00 00 05
00 00 00 03
00 00 00 08
FF FF FF FF <<< int * p указывает на этот элемент
00 00 00 09
00 00 00 01
00 00 00 06
00 00 00 08
00 00 00 04


Вот чуть изменённый вариант вашей программы (для наглядности):

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
#include <iostream>
 
using namespace std;
 
int * min(int *A, int size);
 
int main()
{
        const int s=10;
        int arr[s] = {7,5,3,8,-1,9,1,6,8,4}, *p;
        
        p = arr; // это не нужно
        p = min(arr, s); // ПОСМОТРИТЕ НА ЭТУ СТРОЧКУ
        
        for( int i = 0; i < 10; i++ )
        {
           cout << "arr[" << i << "]:\t" << &arr[i] << ": " << arr[i];
           
           if( &arr[i] == p ) // сравнение адресов; если p указывает сюда
              cout << " <---- *p";
           
           cout << endl;
        }
        
        cout << "\n*p:\t" << p << ": " << *p << endl;
        
        system( "pause > nul" );
        
        return 0;
}
 
int * min(int *A, int size)
{
        int *min_element;
        
        min_element=A;          
        min_element = &A[0];
        
        for(int i=1; i<size; i++)
                if(A[i] < *min_element) 
                   min_element = &A[i];        
        
        return min_element;
}
1
grrrrr
45 / 45 / 7
Регистрация: 21.04.2009
Сообщений: 265
13.03.2011, 23:36  [ТС] #3
talis, кажется я понял.

C++
1
2
p=arr;     //здесь я указателю р указываю на первый элемент массива arr.
p=min(arr,s); //а здесь я присваиваю указателю р адрес минимального элементы массива arr.
потому и не сходились мои адреса arr и р.
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
13.03.2011, 23:38 #4
Да, всё верно. Только зачем вы делаете p = arr? Это же бессмысленно, он в следующей строчке переписывается значением, возвращённым из min(). И в min() вот эти две строчки

C++
1
2
min_element=A;          
min_element = &A[0];
... делают одно и то же. Первая берёт адрес начала массива, а вторая - адрес нулевого элемента массива, то есть того же самого начала массива. Зачем?..

Удачи.
0
13.03.2011, 23:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.03.2011, 23:38
Привет! Вот еще темы с ответами:

Возврат вектора из функции - C++
Как вывести вектор из функции через адреса или указатели? Можно и внутри вектор создать, его главное вывести. #include &lt;vector&gt; //И...

Возврат массива из функции - C++
Здравствуйте, Не пойму почему не работает данный код. Пишет cannot convert 'std::string*' to 'int*' in return По теории я жду...

Возврат массива из функции - C++
В объекте есть массив int state;, который мне нужно из него вытащить. Вижуал показывал ошибку, когда я пытался вернуть указатель state в...

Возврат строки из функции - C++
//char perfomers; //char _perfomers; char GetPerfomers(){strcpy(_perfomers,perfomers);return *_perfomers;} Есть у меня такая...


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

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

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