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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разница между [] и * 
:(
    Опции темы
sergejzr
Дата 28.9.2006, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Цитата(Romikgy @  28.9.2006,  14:42 Найти цитируемый пост)
согласен , но имхо лучше когда обнуляешь 

Чем?


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
likehood
Дата 28.9.2006, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

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



если что-то нехорошее может произойти, оно обязательно произойдет.
поэтому иногда лучше перестраховаться (хотя в данном случае и не обязательно).
PM MAIL   Вверх
EvgenZ
Дата 28.9.2006, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


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

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



baronp, прав массив передается в функцию как указатель.


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
Romikgy
Дата 29.9.2006, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Цитата(sergejzr @  28.9.2006,  16:04 Найти цитируемый пост)
Чем?

мемсетом smile 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
UnrealMan
Дата 29.9.2006, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(sergejzr @  28.9.2006,  14:40 Найти цитируемый пост)
т.е

int y(char[]) это то же, что и int x(char*) ? 

char[] – это не тип, а обозначение. Для аргумента функции оно означает абсолютно то же самое, что и char *. Типом же является char[n], где n – некоторая константа.

Цитата(baronp @  28.9.2006,  16:37 Найти цитируемый пост)
все таки массив - это структура данных в памяти, она никуда не преобразовывается

Под массивом подразумевался тип. И преобразование типа действительно имеет место.

Цитата(baronp @  28.9.2006,  16:37 Найти цитируемый пост)
Просто когда мы передаем массив в функцию всегда передается его адрес, сама же функция не может определить чем был исходный массив: обычным статическим масивом или указателем, ссылающимся на динамич. массив. В этом смысле при передаче одномерного массива разницы между массивами и указателями нет.

Это ты рассказываешь про функции, аргументы которых объявлены как указатели. Было бы странно ожидать от них чего-то другого.

Для того, чтобы передать в функцию массив (а не просто указатель на его первый элемент) используется ссылка на массив:

Код
int array[10];
void Func(int (&arr)[10]);

Разумеется, никакого копирования элементов при передаче массива по ссылке не происходит.

Если требуется передать массив произвольного размера, то можно воспользоваться шаблоном:

Код
int array1[10];
int array2[20];

template <size_t size>
void Func(int (&arr)[size]);


Так что шаблонная функция вполне может определить, чем был исходный массив.

Цитата(Romikgy @  29.9.2006,  08:50 Найти цитируемый пост)
мемсетом

А списком инициализации не судьба?

Код
char array[20] = {};


Это сообщение отредактировал(а) UnrealMan - 1.10.2006, 20:37
PM MAIL   Вверх
Romikgy
Дата 29.9.2006, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Цитата(UnrealMan @  29.9.2006,  08:44 Найти цитируемый пост)
char array[20] = {0};

прикольно не знал smile 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
UnrealMan
Дата 29.9.2006, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Romikgy @  29.9.2006,  09:59 Найти цитируемый пост)
прикольно не знал 

Если массив будет полем класса, то такой подход не пройдёт. Но даже в этом случае прямое применение memset – не лучшее решение. Надёжнее будет написать коротенькую функцию-шаблон для обнуления:

Код
template <class T, size_t size>
ZeroArray(T (&arr)[size])
{
    memset(arr, 0, size*sizeof(T));
}

Теперь не нужно указывать точный размер массива (функция сама его выведет).
PM MAIL   Вверх
Athlon
Дата 29.9.2006, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 15.1.2006
Где: Украина:: Запорож ье

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



Когда я начинал читать эту тему, то думал, что четко представляю себе различие между передачей параметров по ссылке(char*) и по значению(char[]), а теперь выяснил, что в обоих случаях происходит передача по ссылке и если я изменю значения массива переданого функции, то эти изменения останутся после выхода из функции, например так:
Код

void some_func(char array[])
{
    //............
    array[0] = '1';
    //............
}

void main()
{
    char ch[20];
    ch[0] = '2';
    some_func(ch);
    cout<<ch[0];
}

Т.е. на выходе я получу '1', есть ли еще где-то такие фишки(параметр переданый по значению передается по ссылке)
P.S. это конечно отвратительный стиль менять объекты переданные по значению, но мне любопытно узнать есть ли еще такие фокусы

Это сообщение отредактировал(а) Athlon - 29.9.2006, 15:52
PM MAIL ICQ   Вверх
Oleg_Ci
Дата 15.10.2006, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

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



Смотрим "внутренности" массивов и указателей на указатели
Пытаюсь понять разницу между массивами и указателями и прожку для "разгдядывания" написал.
Запускаете её и она выводит содержимое массива в виде таблицы (число -> строка). Число - это адрес начала строки. Первая таблица выводит параметры массива ( char[][] ), а вторая параметры указателей на указатели ( char ** ). После таблицы выводит ещё пораметры:
1) "Length str2 - str1 (число) "   - это количество байт между началом первой строки и второй. Пример: для массива [10][10] расстояние равно 10(т.е. длинна первой строки, а за ней сразу вторая), а для указателей то 56 то 72).
2) "char **a + 10 -> (строка) "  - это выводится строка, куда указывает "указатель смещённый на длинну строки(10)" от начала первой строки, т.е. в случае с массивом char a[10][10]  выражение a+10 - будет указывать на вторую строку массива, а в случае с указателями небудет.
3) "Size matrix = (число) "   - разница между адресами первого элемента массива и последним. Т.е. для размерности массива 10х10    &a[0][0] - &a[9][9] = 99, т.е. 100 символов (ноль тоже число), а для указателей(char**) &a[0][0] - &a[9][9] = 657 !
Вобщем так получается:
Цитата(sergejzr @  28.9.2006,  17:50 Найти цитируемый пост)
содержимое указателей на указатели может частями находится в любом месте RAM.А у char[10][10] всего 50 байт и все лежат массивом подряд.
Код

#include<iostream>
#include<stdlib.h>
using std::cout;
using std::endl;

int main(int argc, char* argv[])
{    
    const int len = 10; // длинна массива, можно поэксперементировать с ней
    char a[len][len]; // обычный массив

    char **b; // указатели на указатели
    b = new char*[len];
    for ( int i=0; i<len; i++ )
        b[i] = new char[len];

    for ( int i=0; i<len; i++ ) // записываем в массивы буквы
        for ( int j=0; j<len; j++ )
            if ( j==len-1 ) a[i][j] = b[i][j] = 0; // конец строки
            else a[i][j] = b[i][j] = 'a' +j + i; // символы 'a', 'b', ...

/* здесь выводим адреса начала строк в обычном массиве
 и сами строки    */
    for ( int i=0; i<len; i++ )
        cout << (int)&a[i][0] << " -> " << a[i] <<endl;
//_________________________________________
//////// собственно самое итересное здесь начинается /////////////

// тэст обычтого массива:
// 1) выводим расстояние между первой и второй строками (количество байт)
    cout << "\nLength str2 - str1 = " << (int) &a[1][0] - (int) &a[0][0] << "\n";
// 2) выводим то куда указывает указатель начала первой строки
// плюс длинна(len) этой самой строки
    cout << "char a[][] + " << len << " -> " <<(char*) &a[0] +len << "\n";
// 3) выводим занимаемую всем массивом память (нумерация с нуля)
// самое гланое наверно:
    cout << "Size matrix = " 
    << (int) &a[len-1][len-1] - (int) &a[0][0] <<  "  !!!!!\n\n";

/* здесь выводим адреса начала строки в указателях на указатели
 и сами строки    */
    for ( int i=0; i<len; i++ )
        cout << (int)&b[i][0] << " -> " << b[i] <<endl;

/////////// собственно самое итересное здесь /////////////////
// тэст указателей на указатели
    cout << "\nLength str2 - str1 " << (int) &b[1][0] - (int) &b[0][0] << "\n";
    cout << "char **a + " << len << " -> " <<(char*) &b[0] +len << "\n";
    cout << "Size matrix = "
    << (int) &b[len-1][len-1] - (int) &b[0][0] << "  !!!!!\n\n";

// удаляем память
    for ( int j=0; j<10; j++ )
        delete [] b[j];
    delete [] b;

    system("pause");
    return 0;
};

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.1806 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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