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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с указателем на массив в функции (Помогите), Не понимаю что использую внутри ф-ии 
:(
    Опции темы
metoflex
  Дата 18.4.2010, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

Код
void strochka(char** base, int e)       //Функция сортировки строк
{
    char* min;
    char* temp;
    int s;
    

    for (int j = 0; j<e; j++)       // Берёт с первой строки по последнюю и  сравнивает её с остальными в массиве
    {
        min = base[j];
        for (int i = j + 1; i<e; i++)  // со второго элемента до конца файла
        {    

            if ((strcmp(min,base[i]))==1)  //Сравнение строк  (Если min>base[i])

            {                
                min = base [i];  //записываем в min, если найдётся строка меньше чем первая (ASCII) 
                s=i;            //индекс минимального элемента
            }
        }

        if ((strcmp(min,base[j]))==-1)   // Если min<base[j], то выполнит
        {
            temp=base[j];                //записываем в temp значение, хранимое в base[j]
            base[j]=base[s];            //записываем в base[j] значение, хранимое в base[s]
            base[s] = temp;            //записываем в base[s] значение, сохранённое в temp
        }

    }

    for (int k=0;k<=(e-1);k++)
    {

        printf ("Элемент %d >> %s",k+1,base[k]);

    }
}


Вот тут :

            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
PM MAIL   Вверх
ИванМ
Дата 18.4.2010, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



metoflex, если хотите скопировать данные из одного массива в другой, пользуйтесь memcpy или strcpy если это си-строка. В вашем случае вы просто копируете значения указателей и физического копирования данных не происходит.
PM MAIL   Вверх
metoflex
Дата 18.4.2010, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



У меня алгоритм программы сложный и функция strcpy уже использована в основном main.

Я так и не понял. Я меняю простозначения в массиве и работаю с массивом или меняю адреса памяти, относящихся к определённым объектам (элементам)??

Это сообщение отредактировал(а) metoflex - 18.4.2010, 21:49
PM MAIL   Вверх
ИванМ
Дата 18.4.2010, 21:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



metoflex, копируете значения адресов памяти, указывающие на данные массива. Т.е. при таком коде
 temp=base[j];                
 base[j]=base[s];
 base[s] = temp;  
у вас появляются три указателя, указывающие на одно и то же место.
PM MAIL   Вверх
metoflex
Дата 18.4.2010, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



То есть:

 temp=base[j];                //записываем в temp значение, хранимое по адресу base[j]
 base[j]=base[s];            //записываем по адресу base[j] значение, хранимое по адресу base[s]
 base[s] = temp;            //записываем по адресу  base[s] значение, сохранённое в temp


Я правильно понял??



PM MAIL   Вверх
ИванМ
Дата 18.4.2010, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 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
PM MAIL   Вверх
toxx
Дата 18.4.2010, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



temp указатель, указатель указывает на 1й элемент массива
base[j](base[s]) указатель на строку двумерного массива( по сути тотже указатель на 1й элемент одномерного массива)

присваиваешь адрес адресу
PM MAIL   Вверх
metoflex
Дата 18.4.2010, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Таааак, кажется становится всё уже более или менее понятным..Спасибо Огромное!

Если не рудно, можно ещё вопрос?

В квадратных скобках у меня base[j] j-это смещение в памяти на энное кол-во бит, т.е. при первом проходе указатель будет на первом бите, привтором проходе цикла, уже будет на 2-ом (т.к. указатель на указатель на char)?? 

А если бы был указатель на указатель на int, то при втором проходе он бы считывал информацию уже с четвёртого бита?

Спасибо Огромное!
PM MAIL   Вверх
ИванМ
Дата 18.4.2010, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(toxx @  18.4.2010,  22:05 Найти цитируемый пост)
присваиваешь адрес адресу 

адрес адресу нельзя присвоить
можно присвоить значение адреса другому значению по какому то адресу

не путать со значением, на которое указывает адрес
PM MAIL   Вверх
toxx
Дата 18.4.2010, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



metoflex 
да это смещение и выглядит если в адресной арифметике както так
Код

*( base+j)

не бит, а байт int это 4 байта

PM MAIL   Вверх
ИванМ
Дата 18.4.2010, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



metoflex, base[0] это адрес нулевого элемента массива base. base[1] - адрес нулевого элемента + sizeof(ptrdiff_t)
если бы был указатель на int, было бы тоже самое. Указатели на любой тип имеют одинаковый размер.

Это сообщение отредактировал(а) ИванМ - 18.4.2010, 22:18
PM MAIL   Вверх
metoflex
Дата 18.4.2010, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ИванМ, 


можно присвоить значение адреса другому значению по какому то адресу

Т.е. в строке:

base[j]=base[s]

base[j] указывает на ту же область памяти, что и base[s], а не принимает в j-ое смещение (арифметика указателей) значение хранящееся в base[s] ??


PM MAIL   Вверх
ИванМ
Дата 18.4.2010, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(metoflex @  18.4.2010,  22:08 Найти цитируемый пост)
base[j] j-это смещение в памяти на энное кол-во бит,

Для x86 это смещение на 32 бита * j или 4 байта * j. Для x64 соответственно больше.

Добавлено через 3 минуты и 6 секунд
Цитата(metoflex @  18.4.2010,  22:19 Найти цитируемый пост)
base[j] указывает на ту же область памяти, что и base[s], а не принимает в j-ое смещение (арифметика указателей) значение хранящееся в base[s] ??

base[j] указывает на ту же область памяти, что и base[s], а не копирует данные, на которых указывает адрес, хранящийся в base[s] в область памяти, на которое указывает base[j].
PM MAIL   Вверх
metoflex
Дата 18.4.2010, 22:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ИванМ, 

Спасибо Вам Огромное! Я бы без Вас, сам...вряд ли разобрался бы... написал программу, подразумевая, что работаю с обычным массивом, а как в последствии оказалось, всё намного, намного сложнее...

Спасибо Огромное!!!


toxx, 

Вам тоже Спасибо за оказанную помощь!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


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

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


 




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


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

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