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

[Указатели]Использование операции получения адреса операнда - C++

Восстановить пароль Регистрация
 
Jimmy
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 11
18.09.2012, 04:29     [Указатели]Использование операции получения адреса операнда #1
Здравствуйте! Объясните пожалуйста, почему в пером случае, когда присваиваем указателю p_test адрес переменной test, использование оператора & обязательно, а во втором примере, он не используется.
Есть ли у операции получения адреса операнда более короткое название?
Спасибо.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
int main()
{
 
 
 
 
        //example 1 pointer to int
    
    int test = 10;
    int *p_test;
    p_test = &test;
    cout << p_test << endl;
 
        //example 2 pointer to int array
    int test_arr[3] = {1,2,3};
    p_test = test_arr;
    cout << p_test;
 
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.09.2012, 04:29     [Указатели]Использование операции получения адреса операнда
Посмотрите здесь:

C++ строки, указатели и адреса
указатели и адреса. C++
Адреса и указатели на языке С++ C++
C++ Адреса и указатели
C++ Указатели и адреса объектов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
18.09.2012, 04:49     [Указатели]Использование операции получения адреса операнда #2
Jimmy, в первом случае Вы объявляете переменную, берете ее адрес, и присваиваете ее указателю. Во втором случае Вы объявляете статический массив, имя которого является константным указателем на его первый элемент. То есть аналогично было бы записать вот так:
C++
1
2
3
int test_arr[3] = {1,2,3};
p_test = &test_arr[ 0 ];
cout << p_test;
Jimmy
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 11
18.09.2012, 05:12  [ТС]     [Указатели]Использование операции получения адреса операнда #3
Ага, я понял. То есть получается, что имя любого массива это указатель на первый элемент. И нет никакого смысла в строке p_test = test_arr; Можно сразу написать cout << test_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
#include <iostream>
using namespace std;
 
void my_func(int *val, int size)
{
    for(int i = 0;i < size; i++)
    cout << val[i] << " ";
    cout << endl;
}
 
void my_func2(char *arr)
{
    int i;
    for(i = 0; arr[i] != '\0'; i++)
    cout << arr[i] << " ";
    cout << "Size of char array = " << i + 1;
    cout << endl;
}
int main()
{
 
    char char_arr[7] = "ABCDEF";
    int int_arr[5] = {1,2,3,4,5};
 
    my_func(int_arr, sizeof(int_arr)/sizeof(int));
    my_func2(char_arr);
 
    return 0;
}
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
18.09.2012, 05:20     [Указатели]Использование операции получения адреса операнда #4
Jimmy, да, все верно, нужно передавать размер массива.

Цитата Сообщение от Jimmy Посмотреть сообщение
Можно сразу написать cout << test_arr;?
Смотря что Вы хотите вывести.
Jimmy
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 11
18.09.2012, 05:26  [ТС]     [Указатели]Использование операции получения адреса операнда #5
Цитата Сообщение от Toshkarik Посмотреть сообщение
Jimmy, да, все верно, нужно передавать размер массива.


Смотря что Вы хотите вывести.
Я имел ввиду, что в рамках моего примера, нет смысла создавать два одинаковых указателя на один объект(так как имя массива само по себе является указателем), чтобы вывести адрес первого элемента.
Спасибо! Кажется, всё встало на свои места.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
18.09.2012, 05:30     [Указатели]Использование операции получения адреса операнда #6
Jimmy, да, все верно, только лучше для вывода значений указателей приводить их к типу void *

Добавлено через 2 минуты
C++
1
std::cout << static_cast< void * >( ptr );
Jimmy
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 11
18.09.2012, 19:23  [ТС]     [Указатели]Использование операции получения адреса операнда #7
Посидел, почитал. Не очень понимаю смысл приведения типов тут. Как я понял, имеет смысл определить тип void для указателя, если тип неизвестен(как в моем примере) и для правильного вывода и в каких еще случаях? Результат работы моей программы:
0012FF70
A└*↕
0012FF5C
0012FF60
Address = 0012FF70
Address = 0012FF77
Address = 0012FF5C
Address = 0012FF60
Заинтересовался второй строкой консольного вывода. Получается, что в поток вывода попал указатель на c_val и cout начал выводить все байты по очереди до того момента, пока не встретил закрывающий ноль? Поэтому тоже следует приводить к типу войд?

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
#include <iostream>
using namespace std;
 
void show_address(void* adr)
{
    cout << "Address = " << adr << endl;
}
 
int main()
{
    int i_val = 10;
    char c_val = 'A';
    char c_arr[] = "abc";
    int i_arr[] = {1,2,3};
 
    cout << &i_val << endl;
    cout << &c_val << endl;
    cout << &c_arr << endl;
    cout << &i_arr << endl;
 
    show_address(static_cast<void *>(&i_val));
    show_address(static_cast<void *>(&c_val));
    show_address(static_cast<void *>(&c_arr));
    show_address(static_cast<void *>(&i_arr));
 
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.09.2012, 19:30     [Указатели]Использование операции получения адреса операнда
Еще ссылки по теме:

Передача операнда внутри переопределенной операции C++
Операция получения адреса & и vector C++
C++ Указатели, адреса и значения

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

Или воспользуйтесь поиском по форуму:
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
18.09.2012, 19:30     [Указатели]Использование операции получения адреса операнда #8
Цитата Сообщение от Jimmy Посмотреть сообщение
Получается, что в поток вывода попал указатель на c_val и cout начал выводить все байты по очереди до того момента, пока не встретил закрывающий ноль? Поэтому тоже следует приводить к типу войд?
Именно поэтому и стоит.
Yandex
Объявления
18.09.2012, 19:30     [Указатели]Использование операции получения адреса операнда
Ответ Создать тему
Опции темы

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