Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Evgenii Kushner
12 / 12 / 8
Регистрация: 12.08.2015
Сообщений: 55
#1

Указатель на массив. Приведение типов - C++

12.08.2015, 13:18. Просмотров 420. Ответов 10
Метки нет (Все метки)

Всем привет, есть вопрос.

Указатель на массив и указатель на его первый элемент равны,

C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
int main() // код рабочий
{
    int mas[2][2]= {1,2,3,4};
    int (*ptr)[2][2],*fp;
    ptr = &mas;
    fp = &((*ptr)[0][0]);
    std::cout << ptr << '\n' << fp;
}
тут выводит всё хорошо но я не могу передать адрес указателя на массив в обычный указатель типа *pt,
C++
1
fp = &ptr; // ошибка
вот так, например, значит ли это что в указателе на массив (int (*ptr)[2][2]) храниться не только адрес первого элемента,
но еще и другая информация можеть быть о размере или границах ?
C++
1
2
3
4
5
6
7
#include <iostream>
 
int main() //код рабочий
{
    int (*ptr)[2][2],*fp;
    std::cout << sizeof ptr << '\n' << sizeof fp;
}
этот код возвращяет одинаковое кол-во байт по 8 для каждого.
В чем секрет?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2015, 13:18
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Указатель на массив. Приведение типов (C++):

Работа с файлами (массив приведение типов) Visual studio
Будте добры, помогите разобраться с задачей: в текстовом файле хранится...

Приведение любого двумерного массива к типу указатель на указатель
Допустим, есть несколько массивов int arr1; int arr2; int arr3; Какое...

Приведение типов
Есть ли какая-нибудь разница в следующих выражениях: float a = 123.4f ...

Приведение типов.
Доброго времени суток! В общем, есть класс Matrix(прямоугольные над полем...

Приведение типов
При вводе с клавиатуры s = 11 и a = 1.1, получаем 9. Результат переменной d =...

Приведение типов
Есть задача создать список с объектами у которых разные классы, но один базовый...

10
Velesthau
524 / 426 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
12.08.2015, 13:23 #2
Цитата Сообщение от Evgenii Kushner Посмотреть сообщение
тут выводит всё хорошо но я не могу передать адрес указателя на массив в обычный указатель типа *pt,
fp = &ptr; // ошибка
Потому что типы разные. На уровне языка. Я же без явного приведения не могу указатель на свой объект присвоить любому другому. Хотя указатель так же хранит адрес. Почему здесь должно быть иначе? Типы точно такие же разные.
Цитата Сообщение от Evgenii Kushner Посмотреть сообщение
вот так, например, значит ли это что в указателе на массив (int (*ptr)[2][2]) храниться не только адрес первого элемента,
но еще и другая информация можеть быть о размере или границах ?
Только адрес элемента, ни о каких размерах и границах данных нет. Они используются только во время компиляции.
0
Evgenii Kushner
12 / 12 / 8
Регистрация: 12.08.2015
Сообщений: 55
12.08.2015, 13:26  [ТС] #3
Цитата Сообщение от Velesthau Посмотреть сообщение
Потому что типы разные. На уровне языка. Я же без явного приведения не могу указатель на свой объект присвоить любому другому. Хотя указатель так же хранит адрес. Почему здесь должно быть иначе? Типы точно такие же разные.
Только адрес элемента, ни о каких размерах и границах данных нет. Они используются только во время компиляции.
ну если разные типы данных выводят одинковый результат в чём их различия?
0
Renji
2129 / 1488 / 453
Регистрация: 05.06.2014
Сообщений: 4,329
12.08.2015, 13:37 #4
Цитата Сообщение от Evgenii Kushner Посмотреть сообщение
ну если разные типы данных выводят одинковый результат в чём их различия?
"чем отличается чатланин от пацака?
Ты что, дальтоник? красную лампочку от зеленой отличить не можешь?" (c) Кин-дза-дза.

Различия в том, как с этими указателями можно работать. ptr[1][2] написать можно, fp[2][2] нет.
0
Velesthau
524 / 426 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
12.08.2015, 13:38 #5
Цитата Сообщение от Evgenii Kushner Посмотреть сообщение
ну если разные типы данных выводят одинковый результат в чём их различия?
Одинаковый адрес это не одинаковый результат. Как ты к своим элементам будешь обращаться через int* fp? [][]? попробуй и покажи, где там одинаковый результат.
C++
1
2
3
4
5
    int mas[2][2];
    int (*ptr)[2][2] = &mas, (*fp)[2][2], *fp2;
    fp = ptr;
    fp2 = reinterpret_cast<int*>(ptr);
    std::cout << fp << " " << fp2 << std::endl << (fp + 1) << " " << (fp2 + 1) << std::endl;
Вот пример кода, который выдаст для указателей, который указывают на один адрес, разные адреса в последствии при действиях с ними.
0
Evgenii Kushner
12 / 12 / 8
Регистрация: 12.08.2015
Сообщений: 55
12.08.2015, 14:05  [ТС] #6
вот тут совпадают первые адреса и результаты а дальше не совпадают переменные внутри
Цитата Сообщение от Velesthau Посмотреть сообщение
Одинаковый адрес это не одинаковый результат. Как ты к своим элементам будешь обращаться через int* fp? [][]? попробуй и покажи, где там одинаковый результат.
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
    int mas[3] = {3,4,5};
    int (*ptr)[3] = &mas, *fp;
    fp = &mas[0];
    for(int i = 0; i < 3; ++i) {
    std::cout << ptr + i << " " << fp + i <<'\n';
    }
    for(int i = 0; i < 3; ++i) {
    std::cout << **(ptr + i) << " " << *(fp + i) <<'\n';
    }
}
0x7ffcb35aabb0 0x7ffcb35aabb0
0x7ffcb35aabbc 0x7ffcb35aabb4
0x7ffcb35aabc8 0x7ffcb35aabb8
3 3
0 4
0 5

Я не про в этом я.п. , но все же тип данных в указателе для разных размеров массивов в себе ,наверное, содержит ограничение по размеру массива и типа данных в нем?
0
Velesthau
524 / 426 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
12.08.2015, 14:43 #7
Цитата Сообщение от Evgenii Kushner Посмотреть сообщение
но все же тип данных в указателе для разных размеров массивов в себе ,наверное, содержит ограничение по размеру массива и типа данных в нем?
Я уже написал про указатель:
Цитата Сообщение от Velesthau Посмотреть сообщение
Только адрес элемента, ни о каких размерах и границах данных нет.
Добавлено через 4 минуты
И о типах данных тоже нет. Указатель - это просто число, все.
0
Evgenii Kushner
12 / 12 / 8
Регистрация: 12.08.2015
Сообщений: 55
12.08.2015, 14:55  [ТС] #8
Цитата Сообщение от Velesthau Посмотреть сообщение
Только адрес элемента, ни о каких размерах и границах данных нет.
Это я понял ,спасибо.

Но я предпологаю что тут просто расширеный тип данных который не может быть сопоставлен с обычный указателем.
Например, int *ptr[10][2].

Это будет тип данных целочисленный указатель с дополнительным параметром который хранит размеры массива и всё это внутри себя содержит адрес.

Верно ли я рассуждаю?
0
Velesthau
524 / 426 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
12.08.2015, 15:03 #9
Цитата Сообщение от Evgenii Kushner Посмотреть сообщение
Но я предпологаю что тут просто расширеный тип данных который не может быть сопоставлен с обычный указателем.
Например, int *ptr[10][2].
Любой указатель хранит только адрес и ничего больше нет никакого расширенного типа данных, и любой указатель может быть сопоставлен с любым другим, и сравниваться с ним, и складываться и так далее. На уровне языка С++ тебя просто защищают, чтобы ты не допускал таких ошибок, когда С++ собирается оперировать с одним типом данных, а ты говоришь, что хочешь, чтобы компилятор работал, как будто это другой тип данных. Если ты точно этого хочешь - укажи компилятору явным приведением типа приведением. Ошибка тобой приведенная - обычная защита от дурака. Почему тебя не удивляет, что double* к int* тоже приводит к ошибке? Вот здесь то же самое.
Цитата Сообщение от Evgenii Kushner Посмотреть сообщение
Это будет тип данных целочисленный указатель с дополнительным параметром который хранит размеры массива и всё это внутри себя содержит адрес.
Ничего, блин, указатель не хранит. Нет никаких параметров у него. Компилятор сам знает размер инкремента, потому что ты ему написал [2]. Сам указатель не знает ничего, это число. Число. Обычное число. Все.
Цитата Сообщение от Evgenii Kushner Посмотреть сообщение
Верно ли я рассуждаю?
Нет, не верно.
0
Evgenii Kushner
12 / 12 / 8
Регистрация: 12.08.2015
Сообщений: 55
12.08.2015, 15:18  [ТС] #10
Вроде понял, спасибо. Мб тут можно лайк поставить за помощь?
0
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
12.08.2015, 15:24 #11
Цитата Сообщение от Evgenii Kushner Посмотреть сообщение
Мб тут можно лайк поставить за помощь?
Можно.
0
12.08.2015, 15:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2015, 15:24
Привет! Вот еще темы с решениями:

Приведение типов
Доброго времени суток. Есть вопрос. Допустим: class Base { ..... }...

Приведение типов
Как привести наследника ко второму родителю? class Parent1 { public: ...

Приведение типов
Доброго времени суток. Данный кусок кода выделяет целую часть. Потом,...

Приведение типов
Добрый вечер! Реализовываю явное и не явное приведение типов. Есть два...


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

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

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