Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/45: Рейтинг темы: голосов - 45, средняя оценка - 4.69
 Аватар для KuKu
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995

Статические массивы

04.04.2011, 19:48. Показов 9497. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
    int a[4];
    cout << sizeof(a) << endl;
    cout << a << endl;
Добрый день. Почему выводится, что sizeof(a)=16 байт. a же это адрес, т.е. = 4 байта, а не размер массива.
P.S. буду рад за направление на литературу по памяти, где есть объяснения по стэкам, кучам и т.д.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.04.2011, 19:48
Ответы с готовыми решениями:

статические массивы
Дана ценлочисленная прямоугольная матрица. Определитть номер первого из столбцов, содержащих хотя бы один нулевой элемент. ...

Статические массивы
Перевести в веденой строке все буквы из нижнего регистра в верхний?? Пожалуйста помогите!!! Добавлено через 56 секунд Пожалуйста!!!

Массивы(статические)
Найти максимальную по длине монотонную (т. е. либо неубывающую, либо невозрастающую) подпоследовательность заданного массива целых чисел ...

15
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
04.04.2011, 19:58
a - не адрес. И не указатель. Имя массива может ассоциироваться с адресом его первого элемента, но, тем не менее, sizeof(a) вернёт размер, занимаемый в памяти всем массивом. Разве вы не знаете об одном из способов узнать количество элементов статического массива?

C
1
unsigned number_of_elements = sizeof(static_array_name) / sizeof(static_array_name[0]]);
1
 Аватар для KuKu
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
04.04.2011, 20:06  [ТС]
Цитата Сообщение от silent_1991 Посмотреть сообщение
Разве вы не знаете об одном из способов узнать количество элементов статического массива?
я много что не знаю
Цитата Сообщение от silent_1991 Посмотреть сообщение
a - не адрес. И не указатель. Имя массива может ассоциироваться с адресом его первого элемента, но, тем не менее, sizeof(a) вернёт размер, занимаемый в памяти всем массивом.
Т.е a[4] можно сказать структура из 4 интов ?
P.S. про литературу актуально )
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
04.04.2011, 20:09
Хотя, может, зря я так категорично - "не является". Честное слово, напрочь вылетело из головы, можем ли мы с точностью сказать, что имя массива является указателем. Лучше подождать знатоков в этой области, они точнее скажут. Но, тем не менее, факт, что в разных ситуациях имя статического массива интерпретируется по-разному.

Не по теме:

P.S. Вот что значит целый год не прикасаться к сям и писать на плюсах - уже фундаментальные вещи стал забывать... Пичалька...

1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.04.2011, 20:17
silent_1991, Все равно является указателем на первый элемент. Просто размер известен на стадии компиляции и все окей.

C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
int main()
{
    const int n=10;
    int a[n];
    std::cout<<sizeof(a)<<'\n';
    for(int i=0; i<n; ++i)
        std::cout<<a+i<<'\n';
    return 0;
}
1
 Аватар для KuKu
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
04.04.2011, 20:21  [ТС]
Дак просто если он указатель, то почему его размер = размеру массива. И еще вопрос по поводу стэка, этот массив же там хранится. Какой это нафиг стэк ?) В нормально стэке же можно считывать не любой элемент, а только верхний. А тут любой вытаскиваем ... ну это так к слову
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.04.2011, 20:25
KuKu, Потому что компилятор знает размер этого массива еще на этапе компиляции. Потому и может посчитать.
В первом случае 40, во втором 4 (у меня по крайней мере).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
struct t
{
    int a;
    char c;
};
 
int main()
{
    t arr[5];
    std::cout<<sizeof(arr)<<'\n';
    t* arr2=new t[5];
    std::cout<<sizeof(arr2)<<'\n';
    delete[] arr2;
    return 0;
}
1
 Аватар для KuKu
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
04.04.2011, 20:29  [ТС]
Цитата Сообщение от ForEveR Посмотреть сообщение
KuKu, Потому что компилятор знает размер этого массива еще на этапе компиляции. Потому и может посчитать.
Это понимаю, что компилятор на этапе компиляции это знает. Просто странно, его просят вывести рамер переменной-адреса(другое дело, что это никому не надо наверное), а он выводит размер памяти с этого адреса(не знаю как это сказать красиво ).
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.04.2011, 20:34
Цитатко
A7.4.8. Оператор определения размера sizeof

Оператор sizeof дает число байтов, требуемое для хранения объекта того типа, который имеет его операнд. Операнд - либо выражение (которое не вычисляется), либо имя типа, записанное в скобках. Примененный к char оператор sizeof дает 1. Для массива результат равняется общему количеству байтов в массиве, для структуры или объединения - числу байтов в объекте, включая и байты- заполнители, которые понадобились бы, если бы из элементов составлялся массив. Размер массива из n элементов всегда равняется n, помноженному на размер отдельного его элемента. Данный оператор нельзя применять к операнду типа "функция", к незавершенному типу и к битовому полю. Результат - беззнаковая целочисленная константа: конкретный ее тип зависит от реализации. В стандартном заголовочном файле <stddef.h>(см. приложение B) этот тип определяется под именем size_t.
1
 Аватар для KuKu
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
04.04.2011, 20:48  [ТС]
Определение массива в С++ нечто расплывчатое... т.е. a[4], тут а это массив, а не указатель получается, так ?

Не по теме:


новый тип что ль :D



Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <typeinfo>
 
using namespace std;
 
int main() 
{
    int a[8];
    int b[9];
 
    cout << typeid(a).name() << endl;
    cout << typeid(b).name() << endl;    
    system("pause");
    return (0); 
}
Блин и в правду новый тип, но в другом смысле )

Добавлено через 5 минут
про литературы все еще актуально.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
05.04.2011, 04:58
C89

3.1.2.5 Types
Any number of derived types can be constructed from the basic,
enumerated, and incomplete types, as follows:

* An array type describes a contiguously allocated set of objects
with a particular member object type, called the element type .Array
types are characterized by their element type and by the number of
members of the array. An array type is said to be derived from its
element type, and if its element type is T , the array type is
sometimes called ``array of T .'' The construction of an array type
from an element type is called ``array type derivation.''
3.2.2.1 Lvalues and function designators
Except when it is the operand of the sizeof operator or the unary &
operator, or is a character string literal used to initialize an array
of character type, or is a wide string literal used to initialize an
array with element type compatible with wchar_t, an lvalue that has
type ``array of type '' is converted to an expression that has type
``pointer to type '' that points to the initial member of the array
object and is not an lvalue.
указатель - производный тип
массив - производный тип
производные типы происходят от основных типов
2
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
05.04.2011, 08:59
Цитата Сообщение от KuKu Посмотреть сообщение
Т.е a[4] можно сказать структура из 4 интов ?
Нет, массив - это именно массив. Внутренняя реализация массива основана на указателях, а при передаче в функцию с прототипом
C++
1
void (int *a, int n);
можно в качестве первого параметра использовать имя массива, но a - не указатель, а имя связанное с указателем на нулевой элемент массива.
1
 Аватар для KuKu
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
05.04.2011, 16:45  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
    struct aaa
    {
        int a0;
        int a1;
        int a2;
        int a3;
        operator int*()
        {
            return(&a1);
        };
    };
а такая структура сойдет за замену int a[4] или в ней что-то не такое ?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
06.04.2011, 01:47
Цитата Сообщение от taras atavin Посмотреть сообщение
Нет, массив - это именно массив. Внутренняя реализация массива основана на указателях, а при передаче в функцию с прототипом
C++
1
void (int *a, int n);
можно в качестве первого параметра использовать имя массива, но a - не указатель, а имя связанное с указателем на нулевой элемент массива.
int *a - это указатель
это локальная переменная-указатель, в которую при вызове функции копируется адрес
когда в функцию передаётся имя массива, оно превращается в адрес первого элемента массива
этот адрес копируется в эту переменную
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
06.04.2011, 05:23
Цитата Сообщение от accept Посмотреть сообщение
int *a - это указатель
Да, но при присваивании значения одного типа переменной другого типа и при несовпадении типов формального и фактического параметра стандарт предусматривает приведение типа, а приведение типа массива к типу указателя на базовый тип в том же стандарте определено как прямой доступ к связанному с именем массива указателю без фактического преобразования. Поэтому, хотя int *a - указатель, а int a[4] - массив, но такой вызов допустим. Можно и так:
C++
1
2
3
int a[4]; // a - массив
int *b; // b - указатель
b=a;
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
06.04.2011, 08:51
Цитата Сообщение от taras atavin
Да, но при присваивании значения одного типа переменной другого типа
там нет присваивания с разными типами, там присваивание уже с одинаковыми типами происходит, так как имя массива преобразуется в указатель ещё до начала выполнения операции

https://www.cyberforum.ru/post1521138.html
там выделено
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.04.2011, 08:51
Помогаю со студенческими работами здесь

статические массивы
Помогите, пожалуйста) Нужно выполнить следующее задание с использованием статических массивов: Дана квадратная матрица. Упорядочить...

двумерные статические массивы
Дана квадратная матрица. Отсортировать по убыванию первую её строку и все строки содержащие элементы, равные наибольшему элементу матрицы. ...

Одномерные статические массивы
Ввести одномерный статический массив из к чисел. И сдвинуть элементы массива циклически на n позиций влево.

Статические и динамические массивы
Здравствуйте. Является ли массив статическим, когда количество ячеек (размеры) задано константой, а значения ячеек - нет?

Одномерные статические массивы
1) Необходимо удалить все четные элементы 2) Необходимо добавить k элементов в начало массива. 3) Необходимо переставить четные...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru