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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 54, средняя оценка - 4.89
KuKu
 Аватар для KuKu
1538 / 1016 / 69
Регистрация: 17.04.2009
Сообщений: 2,946
04.04.2011, 19:48     Статические массивы #1
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++ Статические массивы
статические массивы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 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
 Аватар для KuKu
1538 / 1016 / 69
Регистрация: 17.04.2009
Сообщений: 2,946
04.04.2011, 20:06  [ТС]     Статические массивы #3
Цитата Сообщение от silent_1991 Посмотреть сообщение
Разве вы не знаете об одном из способов узнать количество элементов статического массива?
я много что не знаю
Цитата Сообщение от silent_1991 Посмотреть сообщение
a - не адрес. И не указатель. Имя массива может ассоциироваться с адресом его первого элемента, но, тем не менее, sizeof(a) вернёт размер, занимаемый в памяти всем массивом.
Т.е a[4] можно сказать структура из 4 интов ?
P.S. про литературу актуально )
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
04.04.2011, 20:09     Статические массивы #4
Хотя, может, зря я так категорично - "не является". Честное слово, напрочь вылетело из головы, можем ли мы с точностью сказать, что имя массива является указателем. Лучше подождать знатоков в этой области, они точнее скажут. Но, тем не менее, факт, что в разных ситуациях имя статического массива интерпретируется по-разному.

Не по теме:

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

ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
 Аватар для KuKu
1538 / 1016 / 69
Регистрация: 17.04.2009
Сообщений: 2,946
04.04.2011, 20:21  [ТС]     Статические массивы #6
Дак просто если он указатель, то почему его размер = размеру массива. И еще вопрос по поводу стэка, этот массив же там хранится. Какой это нафиг стэк ?) В нормально стэке же можно считывать не любой элемент, а только верхний. А тут любой вытаскиваем ... ну это так к слову
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
 Аватар для KuKu
1538 / 1016 / 69
Регистрация: 17.04.2009
Сообщений: 2,946
04.04.2011, 20:29  [ТС]     Статические массивы #8
Цитата Сообщение от ForEveR Посмотреть сообщение
KuKu, Потому что компилятор знает размер этого массива еще на этапе компиляции. Потому и может посчитать.
Это понимаю, что компилятор на этапе компиляции это знает. Просто странно, его просят вывести рамер переменной-адреса(другое дело, что это никому не надо наверное), а он выводит размер памяти с этого адреса(не знаю как это сказать красиво ).
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.04.2011, 20:34     Статические массивы #9
Цитатко
A7.4.8. Оператор определения размера sizeof

Оператор sizeof дает число байтов, требуемое для хранения объекта того типа, который имеет его операнд. Операнд - либо выражение (которое не вычисляется), либо имя типа, записанное в скобках. Примененный к char оператор sizeof дает 1. Для массива результат равняется общему количеству байтов в массиве, для структуры или объединения - числу байтов в объекте, включая и байты- заполнители, которые понадобились бы, если бы из элементов составлялся массив. Размер массива из n элементов всегда равняется n, помноженному на размер отдельного его элемента. Данный оператор нельзя применять к операнду типа "функция", к незавершенному типу и к битовому полю. Результат - беззнаковая целочисленная константа: конкретный ее тип зависит от реализации. В стандартном заголовочном файле <stddef.h>(см. приложение B) этот тип определяется под именем size_t.
KuKu
 Аватар для KuKu
1538 / 1016 / 69
Регистрация: 17.04.2009
Сообщений: 2,946
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
4838 / 3237 / 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
Ушёл с форума.
 Аватар для 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
 Аватар для KuKu
1538 / 1016 / 69
Регистрация: 17.04.2009
Сообщений: 2,946
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
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
06.04.2011, 01:47     Статические массивы #14
Цитата Сообщение от taras atavin Посмотреть сообщение
Нет, массив - это именно массив. Внутренняя реализация массива основана на указателях, а при передаче в функцию с прототипом
C++
1
void (int *a, int n);
можно в качестве первого параметра использовать имя массива, но a - не указатель, а имя связанное с указателем на нулевой элемент массива.
int *a - это указатель
это локальная переменная-указатель, в которую при вызове функции копируется адрес
когда в функцию передаётся имя массива, оно превращается в адрес первого элемента массива
этот адрес копируется в эту переменную
taras atavin
Ушёл с форума.
 Аватар для 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;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.04.2011, 08:51     Статические массивы
Еще ссылки по теме:

C++ Массивы(статические)
статические массивы C++
C++ Массивы. Статические и динамические

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

Или воспользуйтесь поиском по форуму:
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
06.04.2011, 08:51     Статические массивы #16
Цитата Сообщение от taras atavin
Да, но при присваивании значения одного типа переменной другого типа
там нет присваивания с разными типами, там присваивание уже с одинаковыми типами происходит, так как имя массива преобразуется в указатель ещё до начала выполнения операции

Статические массивы
там выделено
Yandex
Объявления
06.04.2011, 08:51     Статические массивы
Ответ Создать тему
Опции темы

Текущее время: 23:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru