![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
||||
|
||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
если что-то нехорошее может произойти, оно обязательно произойдет.
поэтому иногда лучше перестраховаться (хотя в данном случае и не обязательно). |
|||
|
||||
| EvgenZ |
|
|||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: 1 Всего: 11 |
baronp, прав массив передается в функцию как указатель.
-------------------- <удалено администрацией форума> |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
-------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| UnrealMan |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
char[] – это не тип, а обозначение. Для аргумента функции оно означает абсолютно то же самое, что и char *. Типом же является char[n], где n – некоторая константа.
Под массивом подразумевался тип. И преобразование типа действительно имеет место. Это ты рассказываешь про функции, аргументы которых объявлены как указатели. Было бы странно ожидать от них чего-то другого. Для того, чтобы передать в функцию массив (а не просто указатель на его первый элемент) используется ссылка на массив:
Разумеется, никакого копирования элементов при передаче массива по ссылке не происходит. Если требуется передать массив произвольного размера, то можно воспользоваться шаблоном:
Так что шаблонная функция вполне может определить, чем был исходный массив. А списком инициализации не судьба?
Это сообщение отредактировал(а) UnrealMan - 1.10.2006, 20:37 |
||||||||
|
|||||||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
-------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Если массив будет полем класса, то такой подход не пройдёт. Но даже в этом случае прямое применение memset – не лучшее решение. Надёжнее будет написать коротенькую функцию-шаблон для обнуления:
Теперь не нужно указывать точный размер массива (функция сама его выведет). |
|||
|
||||
| Athlon |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 15.1.2006 Где: Украина:: Запорож ье Репутация: нет Всего: нет |
Когда я начинал читать эту тему, то думал, что четко представляю себе различие между передачей параметров по ссылке(char*) и по значению(char[]), а теперь выяснил, что в обоих случаях происходит передача по ссылке и если я изменю значения массива переданого функции, то эти изменения останутся после выхода из функции, например так:
Т.е. на выходе я получу '1', есть ли еще где-то такие фишки(параметр переданый по значению передается по ссылке) P.S. это конечно отвратительный стиль менять объекты переданные по значению, но мне любопытно узнать есть ли еще такие фокусы Это сообщение отредактировал(а) Athlon - 29.9.2006, 15:52 |
|||
|
||||
| Oleg_Ci |
|
||||
![]() 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 ! Вобщем так получается:
|
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |