Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 54, средняя оценка - 4.89
KuKu
1557 / 1035 / 77
Регистрация: 17.04.2009
Сообщений: 2,980
#1

Статические массивы - C++

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

C++
1
2
3
    int a[4];
    cout << sizeof(a) << endl;
    cout << a << endl;
Добрый день. Почему выводится, что sizeof(a)=16 байт. a же это адрес, т.е. = 4 байта, а не размер массива.
P.S. буду рад за направление на литературу по памяти, где есть объяснения по стэкам, кучам и т.д.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.04.2011, 19:48     Статические массивы
Посмотрите здесь:

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

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

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

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

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

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

Динамические и статические массивы - C++
Главное отличие динамических массивов от статических состоит в том, что они могут иметь неопределенный размер до компиляции. Но статический...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
04.04.2011, 19:58     Статические массивы #2
a - не адрес. И не указатель. Имя массива может ассоциироваться с адресом его первого элемента, но, тем не менее, sizeof(a) вернёт размер, занимаемый в памяти всем массивом. Разве вы не знаете об одном из способов узнать количество элементов статического массива?

C
1
unsigned number_of_elements = sizeof(static_array_name) / sizeof(static_array_name[0]]);
KuKu
1557 / 1035 / 77
Регистрация: 17.04.2009
Сообщений: 2,980
04.04.2011, 20:06  [ТС]     Статические массивы #3
Цитата Сообщение от silent_1991 Посмотреть сообщение
Разве вы не знаете об одном из способов узнать количество элементов статического массива?
я много что не знаю
Цитата Сообщение от silent_1991 Посмотреть сообщение
a - не адрес. И не указатель. Имя массива может ассоциироваться с адресом его первого элемента, но, тем не менее, sizeof(a) вернёт размер, занимаемый в памяти всем массивом.
Т.е a[4] можно сказать структура из 4 интов ?
P.S. про литературу актуально )
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
04.04.2011, 20:09     Статические массивы #4
Хотя, может, зря я так категорично - "не является". Честное слово, напрочь вылетело из головы, можем ли мы с точностью сказать, что имя массива является указателем. Лучше подождать знатоков в этой области, они точнее скажут. Но, тем не менее, факт, что в разных ситуациях имя статического массива интерпретируется по-разному.

Не по теме:

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

ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
04.04.2011, 20:17     Статические массивы #5
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;
}
KuKu
1557 / 1035 / 77
Регистрация: 17.04.2009
Сообщений: 2,980
04.04.2011, 20:21  [ТС]     Статические массивы #6
Дак просто если он указатель, то почему его размер = размеру массива. И еще вопрос по поводу стэка, этот массив же там хранится. Какой это нафиг стэк ?) В нормально стэке же можно считывать не любой элемент, а только верхний. А тут любой вытаскиваем ... ну это так к слову
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
04.04.2011, 20:25     Статические массивы #7
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;
}
KuKu
1557 / 1035 / 77
Регистрация: 17.04.2009
Сообщений: 2,980
04.04.2011, 20:29  [ТС]     Статические массивы #8
Цитата Сообщение от ForEveR Посмотреть сообщение
KuKu, Потому что компилятор знает размер этого массива еще на этапе компиляции. Потому и может посчитать.
Это понимаю, что компилятор на этапе компиляции это знает. Просто странно, его просят вывести рамер переменной-адреса(другое дело, что это никому не надо наверное), а он выводит размер памяти с этого адреса(не знаю как это сказать красиво ).
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
04.04.2011, 20:34     Статические массивы #9
Цитатко
A7.4.8. Оператор определения размера sizeof

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

Не по теме:


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



Добавлено через 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 минут
про литературы все еще актуально.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
05.04.2011, 04:58     Статические массивы #11
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.
указатель - производный тип
массив - производный тип
производные типы происходят от основных типов
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.04.2011, 08:59     Статические массивы #12
Цитата Сообщение от KuKu Посмотреть сообщение
Т.е a[4] можно сказать структура из 4 интов ?
Нет, массив - это именно массив. Внутренняя реализация массива основана на указателях, а при передаче в функцию с прототипом
C++
1
void (int *a, int n);
можно в качестве первого параметра использовать имя массива, но a - не указатель, а имя связанное с указателем на нулевой элемент массива.
KuKu
1557 / 1035 / 77
Регистрация: 17.04.2009
Сообщений: 2,980
05.04.2011, 16:45  [ТС]     Статические массивы #13
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] или в ней что-то не такое ?
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
06.04.2011, 01:47     Статические массивы #14
Цитата Сообщение от taras atavin Посмотреть сообщение
Нет, массив - это именно массив. Внутренняя реализация массива основана на указателях, а при передаче в функцию с прототипом
C++
1
void (int *a, int n);
можно в качестве первого параметра использовать имя массива, но a - не указатель, а имя связанное с указателем на нулевой элемент массива.
int *a - это указатель
это локальная переменная-указатель, в которую при вызове функции копируется адрес
когда в функцию передаётся имя массива, оно превращается в адрес первого элемента массива
этот адрес копируется в эту переменную
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.04.2011, 05:23     Статические массивы
Еще ссылки по теме:

Массивы. Статические и динамические - C++
Объясните, пожалуйста, что такое статические массивы и что такое динамические? Чем отличаются? Как их создавать? Какой лучше?

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

Статические массивы, члены класса - C++
необходимо создать статический массив. компилятор gcc #include&lt;iostream&gt; class c{ public: static const char x = &quot;qwe&quot;; ...

Статические массивы(был бы очень признателен)! - C++
Нужно написать код на с++ ,на данный момент не могу реализовать так как знаний маловато. Task 1. To find the minimum element of...

Mingw, nostdlib и статические констатные массивы - C++
Есть глобальный константный массив, элементы которого имеют тривиальный тип, а значения известны на стадии компиляции. То есть, очевидный...


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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.04.2011, 05:23     Статические массивы #15
Цитата Сообщение от accept Посмотреть сообщение
int *a - это указатель
Да, но при присваивании значения одного типа переменной другого типа и при несовпадении типов формального и фактического параметра стандарт предусматривает приведение типа, а приведение типа массива к типу указателя на базовый тип в том же стандарте определено как прямой доступ к связанному с именем массива указателю без фактического преобразования. Поэтому, хотя int *a - указатель, а int a[4] - массив, но такой вызов допустим. Можно и так:
C++
1
2
3
int a[4]; // a - массив
int *b; // b - указатель
b=a;
Yandex
Объявления
06.04.2011, 05:23     Статические массивы
Ответ Создать тему
Опции темы

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