Jump to content
    

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

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

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

protoss

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

 

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

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

U8 array1[100];

fun( array1, sizeof(array1) );

Share this post


Link to post
Share on other sites

protoss

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

 

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

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

U8 array1[100];

fun( array1, sizeof(array1) );

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

Share this post


Link to post
Share on other sites

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:

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

 

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

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

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

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

 

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...