Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

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

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

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

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

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

15
silent_1991
Эксперт С++
4986 / 3043 / 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]]);
1
KuKu
1558 / 1036 / 78
Регистрация: 17.04.2009
Сообщений: 2,987
04.04.2011, 20:06  [ТС] #3
Цитата Сообщение от silent_1991 Посмотреть сообщение
Разве вы не знаете об одном из способов узнать количество элементов статического массива?
я много что не знаю
Цитата Сообщение от silent_1991 Посмотреть сообщение
a - не адрес. И не указатель. Имя массива может ассоциироваться с адресом его первого элемента, но, тем не менее, sizeof(a) вернёт размер, занимаемый в памяти всем массивом.
Т.е a[4] можно сказать структура из 4 интов ?
P.S. про литературу актуально )
0
silent_1991
Эксперт С++
4986 / 3043 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
04.04.2011, 20:09 #4
Хотя, может, зря я так категорично - "не является". Честное слово, напрочь вылетело из головы, можем ли мы с точностью сказать, что имя массива является указателем. Лучше подождать знатоков в этой области, они точнее скажут. Но, тем не менее, факт, что в разных ситуациях имя статического массива интерпретируется по-разному.

Не по теме:

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

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

Оператор sizeof дает число байтов, требуемое для хранения объекта того типа, который имеет его операнд. Операнд - либо выражение (которое не вычисляется), либо имя типа, записанное в скобках. Примененный к char оператор sizeof дает 1. Для массива результат равняется общему количеству байтов в массиве, для структуры или объединения - числу байтов в объекте, включая и байты- заполнители, которые понадобились бы, если бы из элементов составлялся массив. Размер массива из n элементов всегда равняется n, помноженному на размер отдельного его элемента. Данный оператор нельзя применять к операнду типа "функция", к незавершенному типу и к битовому полю. Результат - беззнаковая целочисленная константа: конкретный ее тип зависит от реализации. В стандартном заголовочном файле <stddef.h>(см. приложение B) этот тип определяется под именем size_t.
1
KuKu
1558 / 1036 / 78
Регистрация: 17.04.2009
Сообщений: 2,987
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 минут
про литературы все еще актуально.
0
accept
4825 / 3246 / 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.
указатель - производный тип
массив - производный тип
производные типы происходят от основных типов
2
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.04.2011, 08:59 #12
Цитата Сообщение от KuKu Посмотреть сообщение
Т.е a[4] можно сказать структура из 4 интов ?
Нет, массив - это именно массив. Внутренняя реализация массива основана на указателях, а при передаче в функцию с прототипом
C++
1
void (int *a, int n);
можно в качестве первого параметра использовать имя массива, но a - не указатель, а имя связанное с указателем на нулевой элемент массива.
1
KuKu
1558 / 1036 / 78
Регистрация: 17.04.2009
Сообщений: 2,987
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] или в ней что-то не такое ?
0
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
06.04.2011, 01:47 #14
Цитата Сообщение от taras atavin Посмотреть сообщение
Нет, массив - это именно массив. Внутренняя реализация массива основана на указателях, а при передаче в функцию с прототипом
C++
1
void (int *a, int n);
можно в качестве первого параметра использовать имя массива, но a - не указатель, а имя связанное с указателем на нулевой элемент массива.
int *a - это указатель
это локальная переменная-указатель, в которую при вызове функции копируется адрес
когда в функцию передаётся имя массива, оно превращается в адрес первого элемента массива
этот адрес копируется в эту переменную
0
taras atavin
3570 / 1753 / 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;
0
06.04.2011, 05:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.04.2011, 05:23
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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