![]() |
|
Модераторы: bsa |
![]()
|
|
| metoflex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 18.4.2010 Репутация: нет Всего: нет |
Я написал программу по сортировке строк из файла, который на жёстком, прога отлично работает, может показаться абсурдом, но я не понял вот в этом куске (функция по обраюотке)-base-содержит в себе все строки файла с жёсткого:
Вот тут : temp=base[j]; //записываем в temp значение, хранимое в base[j] base[j]=base[s]; //записываем в base[j] значение, хранимое в base[s] base[s] = temp; //записываем в base[s] значение, сохранённое в temp Я работаю с массивом и перезаписываю значения в ячейках массива или в квадратных скобках я указываю с какой областью памяти работать? Другими словами я работаю с указателем или с массивами? Если у кого-то есть чёткая информация про указатели и про работу указателя на указатель, пожалуйста напишите ресурс, какая-то каша в голове...( Спасибо Огромное за помощь! Она так нужна... Модератор: не забываем пользоваться кнопочкой "Код". Это сообщение отредактировал(а) bsa - 20.4.2010, 11:27 |
|||
|
||||
| ИванМ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1260 Регистрация: 19.6.2006 Где: СПб Репутация: 3 Всего: 23 |
metoflex, если хотите скопировать данные из одного массива в другой, пользуйтесь memcpy или strcpy если это си-строка. В вашем случае вы просто копируете значения указателей и физического копирования данных не происходит.
|
|||
|
||||
| metoflex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 18.4.2010 Репутация: нет Всего: нет |
У меня алгоритм программы сложный и функция strcpy уже использована в основном main.
Я так и не понял. Я меняю простозначения в массиве и работаю с массивом или меняю адреса памяти, относящихся к определённым объектам (элементам)?? Это сообщение отредактировал(а) metoflex - 18.4.2010, 21:49 |
|||
|
||||
| ИванМ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1260 Регистрация: 19.6.2006 Где: СПб Репутация: 3 Всего: 23 |
metoflex, копируете значения адресов памяти, указывающие на данные массива. Т.е. при таком коде
temp=base[j]; base[j]=base[s]; base[s] = temp; у вас появляются три указателя, указывающие на одно и то же место. |
|||
|
||||
| metoflex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 18.4.2010 Репутация: нет Всего: нет |
То есть:
temp=base[j]; //записываем в temp значение, хранимое по адресу base[j] base[j]=base[s]; //записываем по адресу base[j] значение, хранимое по адресу base[s] base[s] = temp; //записываем по адресу base[s] значение, сохранённое в temp Я правильно понял?? |
|||
|
||||
| ИванМ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1260 Регистрация: 19.6.2006 Где: СПб Репутация: 3 Всего: 23 |
чтобы было понятнее, вы копируете значение адреса. Указатель физически хранит просто адрес
т.е. temp=base[j]; //адрес в temp = адресу в base[j] base[j]=base[s]; //адрес в base[j] = адресу в base[s] base[s] = temp; //адрес в base[s] = адресу в temp |
|||
|
||||
| toxx |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 653 Регистрация: 4.3.2009 Где: НН Репутация: 4 Всего: 13 |
temp указатель, указатель указывает на 1й элемент массива
base[j](base[s]) указатель на строку двумерного массива( по сути тотже указатель на 1й элемент одномерного массива) присваиваешь адрес адресу |
|||
|
||||
| metoflex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 18.4.2010 Репутация: нет Всего: нет |
Таааак, кажется становится всё уже более или менее понятным..Спасибо Огромное!
Если не рудно, можно ещё вопрос? В квадратных скобках у меня base[j] j-это смещение в памяти на энное кол-во бит, т.е. при первом проходе указатель будет на первом бите, привтором проходе цикла, уже будет на 2-ом (т.к. указатель на указатель на char)?? А если бы был указатель на указатель на int, то при втором проходе он бы считывал информацию уже с четвёртого бита? Спасибо Огромное! |
|||
|
||||
| ИванМ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1260 Регистрация: 19.6.2006 Где: СПб Репутация: 3 Всего: 23 |
||||
|
||||
| toxx |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 653 Регистрация: 4.3.2009 Где: НН Репутация: 4 Всего: 13 |
metoflex
да это смещение и выглядит если в адресной арифметике както так
не бит, а байт int это 4 байта |
|||
|
||||
| ИванМ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1260 Регистрация: 19.6.2006 Где: СПб Репутация: 3 Всего: 23 |
metoflex, base[0] это адрес нулевого элемента массива base. base[1] - адрес нулевого элемента + sizeof(ptrdiff_t)
если бы был указатель на int, было бы тоже самое. Указатели на любой тип имеют одинаковый размер. Это сообщение отредактировал(а) ИванМ - 18.4.2010, 22:18 |
|||
|
||||
| metoflex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 18.4.2010 Репутация: нет Всего: нет |
ИванМ,
можно присвоить значение адреса другому значению по какому то адресу Т.е. в строке: base[j]=base[s] base[j] указывает на ту же область памяти, что и base[s], а не принимает в j-ое смещение (арифметика указателей) значение хранящееся в base[s] ?? |
|||
|
||||
| ИванМ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1260 Регистрация: 19.6.2006 Где: СПб Репутация: 3 Всего: 23 |
Для x86 это смещение на 32 бита * j или 4 байта * j. Для x64 соответственно больше. Добавлено через 3 минуты и 6 секунд
base[j] указывает на ту же область памяти, что и base[s], а не копирует данные, на которых указывает адрес, хранящийся в base[s] в область памяти, на которое указывает base[j]. |
|||
|
||||
| metoflex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 18.4.2010 Репутация: нет Всего: нет |
ИванМ,
Спасибо Вам Огромное! Я бы без Вас, сам...вряд ли разобрался бы... написал программу, подразумевая, что работаю с обычным массивом, а как в последствии оказалось, всё намного, намного сложнее... Спасибо Огромное!!! toxx, Вам тоже Спасибо за оказанную помощь! |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |