#include
using namespace std;
int main(){
int a = 7;
long* mas = new long[4];
*mas = 3;
*(mas+1) = 5;
2[mas] = 10;
cout << sizeof *mas << endl ;
cout << sizeof a << "\t" << sizeof &a;
}
Другие языки программирования и технологии
С++. Почему при изменении типа динамического массива размер его элемента не меняеться? и почему размер &а = 8 байт?
Потому, что sizeof mas - это размер УКАЗАТЕЛЯ на long, а sizeof *mas - это размер ОДНОГО значения long; sizeof a - размер ОДНОГО значения int, а sizeof &a - размер УКАЗАТЕЛЯ на int. А 8 потому, что 64-битная программа. Скомпилируешь в 32-битном режиме - будет 4.
Указатель знать не знает, что ты там ему присвоил - один элемент, или массив из 4 элементов. Операция *mas - это получение ОДНОГО элемента по адресу mas.
Указатель знать не знает, что ты там ему присвоил - один элемент, или массив из 4 элементов. Операция *mas - это получение ОДНОГО элемента по адресу mas.
Юрий Антошин
почему когда я меняю лонг на инт в объявлевнии указателя результат остается равным 4?
Динамический массив ничего не знает про свой размер. Это просто указатель.
Всё знание существует только во время компиляции. Если компилятор видит размер, то он его может сказать. Для динамического массива не видит
&a - это указатель. Размер указателя (примерно) то же самое, что размерность платформы. То есть у тебя 8**=64 битный проц указан в цели компиляции
Всё знание существует только во время компиляции. Если компилятор видит размер, то он его может сказать. Для динамического массива не видит
&a - это указатель. Размер указателя (примерно) то же самое, что размерность платформы. То есть у тебя 8**=64 битный проц указан в цели компиляции
Юрий Антошин
А почему если я поменяю в объявлении указателя два лонга на инт.... результат остается одним и тем же.... равным 4 (я про sizeof *mas)?
Где тут изменение типа динамического массива (и что ты под этим подразумеваешь)?
Выражение &a - это ВСЕГДА адрес. Его размер это 4 или 8 байт в зависимости от разрядности приложения.
Выражение &a - это ВСЕГДА адрес. Его размер это 4 или 8 байт в зависимости от разрядности приложения.
Юрий Антошин
А почему если я поменяю в объявлении указателя два лонга на инт.... результат остается одним и тем же.... равным 4 (я про sizeof *mas)?
Указатель имеет 4 или 8 байт в зависимости от разрядности приложения. &a это указатель и к типу а не относится. Ты можешь так же указатель на экземпляр класса получить и он так же будет 4 или 8 байт, даже если внутри экземпляра сотни мегабайт выделены.
Не уверен насчет с++, но в java если массив long, то выдаст ошибку, нужно будет писать a[1]=(long)10; а си вероятно приводит тип к long автоматом. java строже.
Абдул-Рахим Элижбиев
В Java тоже будет автоматическое приведение типа в данном случае
всё дело в квантовой теории поля и Q-валентности бимолярных соединений между кварками и антиматерией
Похожие вопросы
- Задан массив размером 30 элементов. Подсчитать число и сумму положительных элементов в нем. В Паскале. через рандом чисел !
- Вычислить сумму нечетных элементов в программа С++ .Через статический и динамический массив! Вот я сам написал проверьте
- С++: Как изменять размеры многомерных динамических массивов по ходу выполнения программы?
- Программирование ассемблер. Дан массив из 8 байт. Посчитать количество байт, в которых число нулей и единиц одинаковое
- вопрос о динамических массивах в fortran
- динамический массив в Visual C++
- 1. Написать программу, которая заполняет массив целых чисел размеров 20 элементов значениями роста учащихся (случайные ч
- Написать программу в VBA арифметической прогрессии в динамическом массиве.
- ПОМОГИТЕ, ДОБРЫЕ ЛЮДИ!!! Язык С++, записать в массив d нечетные элементы массива А которых нет в В - НЕ ПОЛУЧАЕТСЯ
- C#. Элементы одномерного массива размером 7, которые больше среднего значения элементов массива, заменить на 0.