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

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

Войти
Регистрация
Восстановить пароль
 
Jimmy
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 11
#1

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

18.09.2012, 04:29. Просмотров 1033. Ответов 7
Метки нет (Все метки)

Здравствуйте! Объясните пожалуйста, почему в пером случае, когда присваиваем указателю 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.09.2012, 04:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос [Указатели]Использование операции получения адреса операнда (C++):

Почему при присваивании адреса массива не ставится знак '&' получения адреса - C++
int main() { int a = { 2, 3 }; int* b; b = a; //Почему при присваивании адреса массива не ставится знак '&amp;' получения адреса. ...

Передача операнда внутри переопределенной операции - C++
Здравствуйте. Пытаюсь разобраться с перегрузкой операций для классов, и вот в чем проблема: Есть класс longNumber, в котором...

Операция получения адреса & и vector - C++
Здравствуйте. Работает ли Операция получения адреса (&amp;) в векторе? Просто есть пример в книги, но про вектор ничего не сказано....

указатели и адреса. - C++
Пользователь вводит с клавиатуры строку – предложение с пробелами и знаками пунктуации длиной до 100 символов. Вывести на экран адреса...

Адреса и указатели - C++
Приветствую! Не могу понять, как работать с указателями и адресами для переменных. Если можно, как можно проще объясните, коль не сложно....

Указатели и адреса объектов - C++
Вот код: #include &lt;conio.h&gt; #include &lt;iostream.h&gt; void main() { clrscr(); int a,b,*pa=&amp;a,*pb=&amp;b,z=pb-pa; ...

7
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 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;
1
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;
}
0
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
18.09.2012, 05:20 #4
Jimmy, да, все верно, нужно передавать размер массива.

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


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

Добавлено через 2 минуты
C++
1
std::cout << static_cast< void * >( ptr );
1
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;
}
0
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
18.09.2012, 19:30 #8
Цитата Сообщение от Jimmy Посмотреть сообщение
Получается, что в поток вывода попал указатель на c_val и cout начал выводить все байты по очереди до того момента, пока не встретил закрывающий ноль? Поэтому тоже следует приводить к типу войд?
Именно поэтому и стоит.
1
18.09.2012, 19:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.09.2012, 19:30
Привет! Вот еще темы с ответами:

Строки, указатели и адреса - C++
есть код { char *str=&quot;Welcome&quot;; cout&lt;&lt;str&lt;&lt;&quot; &quot;&lt;&lt;(void *)str&lt;&lt;&quot; &quot;&lt;&lt;&amp;str&lt;&lt;endl; for (int i=0;i&lt;8;i++) { cout&lt;&lt;str&lt;&lt;&quot; /...

Адреса и указатели на языке С++ - C++
Pomogite pliz((( #include &lt;iostream.h&gt; typedef int* IntPtrType; int main() { IntPtrType ptr_a,ptr_b; int num_c=4, num_d=7; ...

Указатели, адреса и значения - C++
У меня 2 вопроса по поводу указателей. Прошу знатоков С++ помочь разобраться 1. Есть код int a = 5; int b = 4; int *c =...

Указатели, Оператор взятия адреса - C++
Вообщем, ребят, недавно разбирался с указателями в С++ и столкнулся с проблемой понимания следующих вопросов: void Concat(string *str)...


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

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

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