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

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

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

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

13.03.2011, 23:18. Просмотров 581. Ответов 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 минут
неужели ни кто не подскажет?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.03.2011, 23:18     Возврат из функции другого адреса
Посмотрите здесь:

Возврат структуры из функции C++
C++ Возврат ссылки из функции
Возврат строки из функции C++
C++ Возврат массива из функции
Возврат итератора из функции C++
C++ Неверный возврат из функции
C++ Возврат массива из функции
Возврат значения функции C++
Возврат boost::any из функции C++
C++ Возврат массива из функции
Возврат вектора из функции C++
Возврат копии структуры из другого класса C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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;
}
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 и р.
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];
... делают одно и то же. Первая берёт адрес начала массива, а вторая - адрес нулевого элемента массива, то есть того же самого начала массива. Зачем?..

Удачи.
Yandex
Объявления
13.03.2011, 23:38     Возврат из функции другого адреса
Ответ Создать тему
Опции темы

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