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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как передать массив в функцию по значению? 
V
    Опции темы
vinter
Дата 2.4.2008, 06:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Rififi, блин, указатель это переменная содержащая адрес, имя массива является адресом. Связи не улавливаешь?
Цитата(Rififi @  1.4.2008,  23:57 Найти цитируемый пост)
в этой записи имя 'arr' имеет тип 'массив из 10 элементов типа int'. всё. где тут уазатель, покажите мне его?

реализация разная, а вот использование одинаково.


--------------------
Мой блог
PM MAIL WWW   Вверх
Dmitriy2k
Дата 2.4.2008, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шустрый
*


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

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



Цитата(UnrealMan @  1.4.2008,  14:36 Найти цитируемый пост)
Имя массива - это не указатель.


а как тогда объяснишь это?

Код

#include "stdafx.h"
#include <stdio.h>
#include <malloc.h>


int main()
{
   int **ptr=(int**)malloc(100);
   ptr[4][4]=5;
   
   return 0;
}

PM MAIL   Вверх
vinter
Дата 2.4.2008, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Dmitriy2k, тут ты объявляешь двойной указатель, а не массив


--------------------
Мой блог
PM MAIL WWW   Вверх
Dmitriy2k
Дата 2.4.2008, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шустрый
*


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

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



правильней конечно будет так:
Код


#include <stdio.h>
#include <malloc.h>


int main()
{
   int arr[]={4,4,4,4,4,4,4};
   int *ptr=arr;  

   ptr[4]=5;

   printf("ptr[4]=%d\n",ptr[4]);
   
   return 0;
}




Цитата(vinter @  2.4.2008,  12:23 Найти цитируемый пост)
Dmitriy2k, тут ты объявляешь двойной указатель, а не массив 

а какая разница то компилятор все равно имя массива приводит к указателю(адресу первого элемента массива)

смоти ассемблерный код:
Код

8:       int arr[]={4,4,4,4,4,4,4};
0040B4D8   mov         dword ptr [ebp-1Ch],4      //первый элемент массива
0040B4DF   mov         dword ptr [ebp-18h],4
0040B4E6   mov         dword ptr [ebp-14h],4
0040B4ED   mov         dword ptr [ebp-10h],4
0040B4F4   mov         dword ptr [ebp-0Ch],4
0040B4FB   mov         dword ptr [ebp-8],4
0040B502   mov         dword ptr [ebp-4],4
9:       int *ptr=arr;
0040B509   lea         eax,[ebp-1Ch]                         //помещаем адрес массива
0040B50C   mov         dword ptr [ebp-20h],eax
10:
11:      ptr[4]=5;
0040B50F   mov         ecx,dword ptr [ebp-20h]
0040B512   mov         dword ptr [ecx+10h],5

PM MAIL   Вверх
Rififi
Дата 2.4.2008, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



vinter, 
Цитата
реализация разная, а вот использование одинаково.

внимательно перечитай мое предыдущее сообшение, особенно про операторы sizeof и &

Добавлено через 2 минуты и 27 секунд
Цитата(Dmitriy2k @  2.4.2008,  12:18 Найти цитируемый пост)
а как тогда объяснишь это?

а что тут обьяснять? завалить программу можно разными способами, например так:

void f(int**);

int arr[10][10];
f((int**) arr);

или даже так:

int* p = NULL;
p[0] = 1;

PM MAIL   Вверх
vinter
Дата 2.4.2008, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



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


--------------------
Мой блог
PM MAIL WWW   Вверх
MAKCim
Дата 2.4.2008, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(Rififi @  1.4.2008,  22:57 Найти цитируемый пост)
если внутри, в машинном представлении какой-то конкретный компилятор реализует массивы через указатели, как очевидно пытается доказать MAKCim

я пытаюсь доказать, что в С/С++ массив нельзя передать в функцию по значению
ассемблерный код тому подтверждение
точка


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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