Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> передать массив в функцию 
:(
    Опции темы
feodorv
Дата 19.9.2013, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(aleksandrkr @  19.9.2013,  15:16 Найти цитируемый пост)
переменная состоит из двух частей

Это очень смелое утверждение  smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
aleksandrkr
Дата 19.9.2013, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



да я с вами согласен я не совсем точно объяснил, точнее я немного исказил реальность дабы донести суть проблемы до новичка.
правда на самом деле в переменной хорониться только адрес в памяти.    
 
int P = 10;
cout << &P <<endl; //адресс
cout <<P <<endl; //значение;

http://www.firststeps.ru/asm/r.php?35 

Это сообщение отредактировал(а) aleksandrkr - 19.9.2013, 17:23
PM MAIL   Вверх
bsa
Дата 20.9.2013, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(aleksandrkr @  19.9.2013,  18:05 Найти цитируемый пост)
правда на самом деле в переменной хорониться только адрес в памяти. 

Это в указателе хранится адрес. А вот массив - это не указатель. Он может быть приведен к указателю (явно или не явно). Но фактически это единая переменная. Переменная - это просто набор данных в памяти. И естественно, известен ее адрес. Другое дело, что адрес может ВЫЧИСЛЯТЬСЯ в процессе работы программы или может быть вшит в нее жестко. Поэтому утверждение о том, что переменная состоит из двух частей имеет столько же смысла, сколько: "моя квартира состоит из двух частей: адрес и помещение".
PM   Вверх
aleksandrkr
Дата 21.9.2013, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



1)переменная типа массив это указатель на его первый элемент.
int arr[10] ={0};
int * p = arr + (sizeof(int) * 4) ; аналогично записи arr[4];
2)int pr; эта запись в процессе компиляции будет заменена на
asm
{

MODEL SMALL
STACK 256
DATASEG

Data1 DB 31h    ; выделить один байт с содержимым 31h

CODESEG
Start:

mov ax,@data ; установка в ds адреса
mov ds,ax ; сегмента данных
mov ax,OFFSET Data1 ; где находиться переменная

End Start

}

компилятор сам просчитает где ляжет переменная и везде где он встретит pr он заменит pr на полученный адрес 0xbfd86d6c
Указатель — это переменная, содержащая адрес некоторого элемента данных (переменной, константы, функции, структуры). В языке C указатели тесно связаны с обработкой массивов и строк  

Бьерн Страуструп. Язык программирования С++
    1.3.2 Переменные и арифметические операции



    Каждое имя и каждое выражение обязаны иметь тип. Именно тип определяет
операции, которые могут выполняться над ними. Например, в описании

    int inch;

    говорится, что inch имеет тип int, т.е. inch является целой
переменной.

    Описание - это оператор, который вводит имя в программу. В описании
указывается тип имени. Тип, в свою очередь, определяет как правильно
использовать имя или выражение.

    Основные типы, наиболее приближенные к "аппаратной реальности" машины,
таковы:

              char
              short
              int
              long

    Они представляют целые числа.  Следующие типы:

              float
              double
              long double

    представляют числа с плавающей точкой. Переменная типа char имеет
размер, нужный для хранения одного символа на данной машине (обычно это
один байт). Переменная int имеет размер, необходимый для целой арифметики
на данной машине (обычно это одно слово).

    Следующие арифметические операции можно использовать над любым
сочетанием перечисленных типов:

            +    (плюс, унарный и бинарный)
            -    (минус, унарный и бинарный)
            *    (умножение)
            /    (деление)
            %    (остаток от деления)

    То же верно для операций отношения:

            ==   (равно)
            !=   (не равно)
            <    (меньше чем)
            <=   (меньше или равно)
            >=   (больше или равно)

    Для операций присваивания и арифметических операций в С++ выполняются
все осмысленные преобразования основных типов, чтобы их можно было
неограниченно использовать любые их сочетания:

            double d;
            int i;
            short s;
            // ...
            d = d + i;
            i = s * i;

    Символ = обозначает обычное присваивание.


    1.3.3 Указатели и массивы



    Массив можно описать так:

    char v [ 10 ]; // массив из 10 символов

    Описание указателя имеет такой вид:

    char * p; // указатель на символ

    Здесь [] означает "массив из", а символ * означает "указатель на".
Значение нижней границы индекса для всех массивов равно нулю, поэтому v
имеет 10 элементов: v [ 0 ] ... v [ 9 ]. Переменная типа указатель может
содержать адрес объекта соответствующего типа:

    p = & v [ 3 ]; // p указывает на 4-й элемент массива v

    Унарная операция & означает взятие адреса.

 
PM MAIL   Вверх
feodorv
Дата 21.9.2013, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(aleksandrkr @  21.9.2013,  12:38 Найти цитируемый пост)
int * p = arr + (sizeof(int) * 4) ; аналогично записи arr[4];

Ну вот зачем такое писать  smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
aleksandrkr
Дата 21.9.2013, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



точно извиняюсь sizeof лишний 
Код

                short arr[] = {0,1,2,3,4,5,6,7,8,9};
        short * p = arr + 4;
        
        std::cout << *p << std::endl;


Добавлено через 7 минут и 20 секунд
у кого нибудь стоит 6 студия.
проверти эту запись.  short * p = arr + 4;
оно правильно отработает или нет.

Добавлено через 8 минут и 44 секунды
по идеи оно работать не должно.
PM MAIL   Вверх
feodorv
Дата 21.9.2013, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(aleksandrkr @  21.9.2013,  20:32 Найти цитируемый пост)
по идеи оно работать не должно. 

Это почему?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
bsa
Дата 28.9.2013, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(aleksandrkr @ 21.9.2013,  12:38)
1)переменная типа массив это указатель на его первый элемент.

Это не так. Массив ведет себя аналогично указателю в большинстве случаев. Но в ряде случаев он отличается: передача массива в качестве параметра шаблонной функции, sizeof. Поэтому нельзя говорить, что массив это указатель.
PM   Вверх
volatile
Дата 28.9.2013, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(aleksandrkr @  21.9.2013,  19:32 Найти цитируемый пост)
у кого нибудь стоит 6 студия.
проверти эту запись.  short * p = arr + 4;
...
по идеи оно работать не должно. 

И проверять нечего.
Такая элементарщина будет правильно работь.
Шестерка конечно отсталый компилер,  но не до такой же степени...


PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0520 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.