Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
2535 / 1195 / 357
Регистрация: 30.11.2013
Сообщений: 3,817
1

Что определяет тип указателя

19.10.2015, 15:30. Просмотров 1708. Ответов 45
Метки нет (Все метки)

Наткнулся на ответ:

Что определяет тип указателя?
Размер смещения при инкременте указателя

Не понял что-то.


int* a;
int - базовый тип
int* - тип переменной( в данном случае указателя)


И где тут смещение? В таблице типов компилятора на момент сборки чтоле?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.10.2015, 15:30
Ответы с готовыми решениями:

typeid определяет тип указателя на базовый класс, как тип "базовый класс". Вне зависимости от присвоенного ему значения
Вот код: #include <iostream> #include <string> #include <conio.h> #include <windows.h>...

Почему увеличение указателя на sizeof(тип) не тождественно инкременту этого же указателя?
Всем доброго дня.:) Можете обьяснить ,почему при инкриментировании указателя,его значение(адресс)...

Узнать тип значения, зная тип указателя
Здравствуйте! Есть такой код: template<class Iter> void func(Iter first, Iter last) { ...

Как изменить тип указателя массива ?
Например создаю массив: void * mass; if(1 == 1) mass = wchar_t; else mass = char; Пример...

45
1401 / 643 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
19.10.2015, 15:44 2
Имеется ввиду, что если инкрементнуть указатель T* ptr, то значение ptr изменится на sizeof(T) (если оба указателя будут указывать на элементы одного массива или one-past-last element)
0
2535 / 1195 / 357
Регистрация: 30.11.2013
Сообщений: 3,817
19.10.2015, 15:55  [ТС] 3
Что определяет тип указателя


Почему имелось ввиду имено третье, а не второе?
0
2572 / 2188 / 233
Регистрация: 03.07.2012
Сообщений: 7,896
Записей в блоге: 1
19.10.2015, 15:55 4
Или если указатель pa на mytip использовать примерно так: mytip a=pa[3];
0
1401 / 643 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
19.10.2015, 15:58 5
C++
1
2
3
4
5
int main()
{
    int x = 5;
    bool* ptr = (bool*)&x;
}
Я понимаю это так: ptr указывает на объект int x.
0
2535 / 1195 / 357
Регистрация: 30.11.2013
Сообщений: 3,817
19.10.2015, 16:07  [ТС] 6
Цитата Сообщение от Dani Посмотреть сообщение
Я понимаю это так: ptr указывает на объект int x.
но ведь тип указатель попрежнему bool*, о чём нам всегда скажет auto / попытка присвоить его не туда / template deduction
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
19.10.2015, 16:15 7
rikimaru2013
Оба ответа верные. С точки зрения операции разименования важно именно то, как интерпретировать биты по заданному адресу. С точки зрения операции сложения с целым -- количество адресуемых ячеек, на которое нужно смещать указатель.
0
Грамотный. Безпорно.
16860 / 9756 / 1880
Регистрация: 27.09.2012
Сообщений: 24,170
Записей в блоге: 2
19.10.2015, 17:24 8
mporro, "как интерпретировать" != "тип объекта". В коде выше в память забит int, но мы его уже расцениваем потом как bool. А компилятору вообще плевать что в памяти, ему важен размер типа. При разыменовании ему также плевать какой реально объект лежит в памяти, ему важно лишь как его интерпретировать. Объект - это просто кусок памяти.
0
Эксперт С++
4964 / 3070 / 456
Регистрация: 10.11.2010
Сообщений: 11,159
Записей в блоге: 10
19.10.2015, 17:28 9
Чушь какая-то. Размер смещения не может определять тип указателя.
Пример:
C++
1
2
float * pf;
int * pi;
Если sizeof( float ) == sizeof( int ), а обычно так и есть, тогда получается что типы указателей одинаковы, хотя это не так.
0
Грамотный. Безпорно.
16860 / 9756 / 1880
Регистрация: 27.09.2012
Сообщений: 24,170
Записей в блоге: 2
19.10.2015, 17:29 10
castaway, сказано, что не размер смещения определяет тип, а тип определяет размер смещения
0
2535 / 1195 / 357
Регистрация: 30.11.2013
Сообщений: 3,817
19.10.2015, 17:30  [ТС] 11
а указатель на пользовательский тип всегда равен машиному слову - тоесть если указатели на класс - то у них одинаковый тип. Согласен, что бред. Надо сжёчь ту контору!!!
0
Эксперт С++
4964 / 3070 / 456
Регистрация: 10.11.2010
Сообщений: 11,159
Записей в блоге: 10
19.10.2015, 17:32 12
Croessmah, где сказано? Я вижу обратное
1
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
19.10.2015, 17:34 13
Croessmah
Нет. Компилятору далеко не всё равно.

C++
1
2
3
4
int a = 3;
int *a_ptr = &a;
 
*a /= 2;
Откуда компилятор знает, что делать в последней строке? Мы же не указали компилятору как "трактовать" память. Но компилятор знает, что *a -- это целое число, потому что с a связана типовая метка, которая компилятору об этом говорит.

Если бы типовая метка указателя не отвечала интерпретации битов, то последняя строчка не была бы возможна.
0
Грамотный. Безпорно.
16860 / 9756 / 1880
Регистрация: 27.09.2012
Сообщений: 24,170
Записей в блоге: 2
19.10.2015, 17:36 14
castaway, просто читаешь в другом ракурсе

Добавлено через 1 минуту
mporro, предлагаю взять объект типа string, привести указатель к int* и провести туже операцию. Компилятору плевать что там string.
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
19.10.2015, 17:40 15
Цитата Сообщение от Croessmah Посмотреть сообщение
привести указатель к int*
Вот именно! Компилятор опирается на тип указателя, когда интерпретирует биты.
Если Вы скажите, что там string, то при разыменовании компилятор будет интерпретировать память как string, а если указатель имеет метку целого числа, то компилятор будет интерпретировать биты как int.

То есть, типовая метка указателя отвечает тому, как интерпретировать биты в памяти.
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
19.10.2015, 17:43 16
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
а указатель на пользовательский тип всегда равен машиному слову - тоесть если указатели на класс - то у них одинаковый тип.
Размер указателя != размер смещения.
Подсказка: у типа указателя больше одного назначения.
0
Эксперт С++
4964 / 3070 / 456
Регистрация: 10.11.2010
Сообщений: 11,159
Записей в блоге: 10
19.10.2015, 17:44 17
Цитата Сообщение от Croessmah Посмотреть сообщение
castaway, просто читаешь в другом ракурсе
Я понял что ты имеешь в виду.
В таком случае вопрос можно понять двусмысленно. В топку такой тест и на кол того кто его написал.
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
19.10.2015, 17:46 18
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
И где тут смещение? В таблице типов компилятора на момент сборки чтоле?
C++
1
2
3
4
5
char* a = "123"; // a = 0x00001000
int asd = 1; 
int* b = &asd; // b = 0x00001010
a++; // a = 0x00001001
b++; // b = 0x00001014
Так понятно?
0
Грамотный. Безпорно.
16860 / 9756 / 1880
Регистрация: 27.09.2012
Сообщений: 24,170
Записей в блоге: 2
19.10.2015, 17:49 19
castaway, вопрос, конечно же, нужно в топку.

Компилятор опирается на тип указателя, когда интерпретирует биты.
Если Вы скажите, что там string, то при разыменовании компилятор будет интерпретировать память как string
Другими словами, какой там в памяти объект ему насрать
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
19.10.2015, 17:58 20
rikimaru2013, что это за автор теста deniska_fob?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.10.2015, 17:58

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как поменять тип данных у указателя?
Здравствуйте, уже часа 3 маюсь, все никак не могу поменять тип данных... это надо для отправки по...

Выражение должно иметь тип указателя
#include "stdafx.h" #include <iostream> #include <conio.h> using namespace std; struct laiks...

Выражение должно иметь тип указателя
if (Settings::Misc::misc_Bhop) { if (pCmd->buttons & IN_JUMP && !(!flag->GetMoveType &...

Выражение должно иметь тип указателя
что тут не так IClientEntity *player=...


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

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

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