Перейти к содержанию
    

в чем прелесть указателей ?

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

В функцию были переданы значения массива путем помещения их (значений) в структуру, но не массив. Массив в С/С++ нельзя передать по значению.
Масло масленное. Правильно, массив нельзя, структуру можно. Теперь, если мы адрес массива приведем к типу структуры мы, фактически, передаем массив в функцию, точнее его копию. И, если и с наружи и внутри функции все знают, что под оберткой передаваемой переменой, то все хлопают в ладоши - массив передан по значению.

 

Еще раз повторюсь. Функция принимает по значению структуру, но мы подсунули ей массив, под видом структуры.

 

И еще раз повторю начало нашего никчемного спора:

 

prottoss: И даже массив мона))) Ежели правильна приготовить

 

dxp: Покажите как? Как передать массив по значению (в качестве аргумента) в функцию?

 

prottoss: ...показываю...

 

dxp: Здесь передается не массив, а структура...

 

Функция принимает в качестве аргумента структуру, но я, правильно его приготовив, скормил его функции, всего то :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какие указатели? "Какой такой павлин-мавлин?"(с)
Вообще то говорилось, что структура попадает в функцию по значению, попробуйте присвоить ей { 0 }

Читайте по губам что спрашивалось, и на что был дан ответ:
Вам необходимо, что бы все поля данной структуры были равны, допустим, нулю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какие указатели? "Какой такой павлин-мавлин?"(с)
Вообще то говорилось, что структура попадает в функцию по значению, попробуйте присвоить ей { 0 }

Читайте по губам что спрашивалось, и на что был дан ответ:
Вам необходимо, что бы все поля данной структуры были равны, допустим, нулю.

Здесь подразумевалось, что структура передается в функцию, а не объявляется внутри функции

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

protoss

прекрасно понимают о чем говорят и что я имею ввиду.

 

Тогда, что с вашей точки зрения передается здесь:

void fun(U8 *param, U16 size)
{
    ... работаем с массивом param
    вместо sizeof используем переданный size
}

U8 array1[100];

fun( array1, sizeof(array1) );

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

protoss

прекрасно понимают о чем говорят и что я имею ввиду.

 

Тогда, что с вашей точки зрения передается здесь:

void fun(U8 *param, U16 size)
{
    ... работаем с массивом param
    вместо sizeof используем переданный size
}

U8 array1[100];

fun( array1, sizeof(array1) );

Здесь передается указатель, и его размер (указателя) в байтах

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

protoss

прекрасно понимают о чем говорят и что я имею ввиду.

 

Тогда, что с вашей точки зрения передается здесь:

void fun(U8 *param, U16 size)
{
    ... работаем с массивом param
    вместо sizeof используем переданный size
}

U8 array1[100];

fun( array1, sizeof(array1) );

Здесь передается указатель, и его размер (указателя) в байтах

Размер указателя всегда один :biggrin:

На 32-битной архитектуре он равен 4-м байтам, на 16-битной - двум. Без вариантов :) :) :) Кроме случая far.

 

P.S. Размер указателя на указатель - тоже :glare:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здесь передается указатель, и его размер (указателя) в байтах
Сорри :) размер массива :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здесь передается указатель, и его размер (указателя) в байтах
Сорри :) размер массива :)

Верно. Указатель и размер.

Указатель в C это есть безразмерный массив (за исключением указателя на void)

 

Относительно моего примера.

Массив мы передали в функцию - нет он остался где-то снаружи.

Работать внутри функции с этим массивом можем - да. Как с массивом - да.

В чем же отличие от передачи структуры - в том, что структура передается через стек и будет локальной переменной внутри функции, т.е. все ее поля будут продублированы и при изменении ее полей внутри функции оригинал не изменится. После выхода из функции эта структура автоматически уничтожится (Вы уже в курсе, даже продемонстрировали asm листинги).

 

Массив при передаче в функцию через указатель никуда не копируется и работаем мы сразу с оригиналом. При передаче через указатель неудобство лишь одно - нельзя узнать размер массива, поэтому его (размер массива) требуется передавать отдельно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...