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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многомерные массивы и указатели, Как получить адрес элемента массива 
V
    Опции темы
Anikmar
Дата 26.4.2007, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(apook @  26.4.2007,  18:01 Найти цитируемый пост)
В догоночку, для ясности 

Для ясности чего?
PM MAIL ICQ   Вверх
apook
Дата 26.4.2007, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



для ясности в кавычках "" не видиш смайлик улыбающийся


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Dov
Дата 27.4.2007, 03:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Ы-ы-ыы, машину разбил. Вернее три машины. Сначала одному задом въехал на заправке, а потом другому в зад заехал на светофоре. Хорошо хоть страховка есть.  Ладно, переживём. smile

Цитата(Fazil6 @  25.4.2007,  08:57 Найти цитируемый пост)
Ты же все время утверждал, что имя двумерного массива является int**

Я и сейчас это утверждаю. А где ты увидел противоречие? Да, я это говорил, не отрицаю. И буду говорить. А ещё я говорил, что тип  int** это ни что иное, как указатель на указатель на  int. Говорил??? Говорил. И что такое указатель на указатель на  int тоже говорил. Могу ещё раз повторить. Это значит, что его значением может быть только адрес. Причём не просто какой-то адрес, а именно адрес указателя на int, т.е. такого указателя, который имеет тип int*. 
Цитата(Fazil6 @  25.4.2007,  08:57 Найти цитируемый пост)
Теперь это у тебя адрес двумерного массива. То есть, грубо говоря, int***
Да пойми ты, наконец, что имя массива и его адрес это совершенно разные вещи. Вот смотри. Покажу тебе на простом примере. Берём двумерный массив А[3][3].В этом массиве есть, как не трудно подсчитать, 9 элементов, имеющих тип int. Но адреса каждого из этих элементов &А[0][0], &А[0][1], &А[0][2]... и т.д. имеют тип int*. Почему? Потому, что являются указателями на тип int. Опять же, почему? Потому, что в С/С++ понятие указатель имеет не только переменная, объявленная, как указатель, напр. int* р; , но и значение этого указателя, напр. &А[0][1] или &var, находящееся справа от знака присваивания. Если в выражении int a = 5 + 2; и переменная а и результат вычисления 5 + 2 имеют тип int, т.е. целые числа, то в выражении int* p = &А[0][0]; и переменная р и результат вычисления &А[0][0] имеют тип int*, т.е. указатели на int. Ну, это хоть понятно? 
Имя одномерного массива А[0], который является подмассивом двумерного массива А[3][3] является указателем потому, что хранит адрес первого элемента А[0][0]. Поэтому имя подмассива А[0] имеет тип int*, точно так же, как и &А[0][0]
Но ведь подмассив А[0] сам является первым элементом массива А. Имя массива А, в свою очередь, является указателем потому, что хранит адрес первого элемента, т.е. подмассива А[0]. И если имя подмассива А[0] имеет тип int*, то его адрес имеет тип  int**, так как является указателем на указатель на  int. Вот и получается, что имя массива А имеет тип int** и является указателем на указатель на int. Почему, опять же? Да всё потому же, ёлы-палы. Потому что адрес его первого элемента это указатель на указатель на int, имеющий тип  int**. Это понятно? 
Что же мы имеем? Смотрите внимательно. Показываю последний раз. Больше повторять не буду.  smile 
Если объект(или его имя, или переменная, не важно) имеет тип  int, то его адрес имеет тип  int*.
Если объект имеет тип  int*, то его адрес имеет тип  int**.
Если объект имеет тип  int**, то его адрес имеет тип  int***...
И так до... Не знаю сколько, но очень долго.
 
Теперь мы видим, что если имя массива имеет тип int**, то его адрес имеет тип  int***. Вот почему я говорил, что адрес двумерного массива имеет тип int***. Но это в том примере не главное. Я хотел сказать другое.  Имя массива не потому указатель, что его можно или нельзя присвоить какому-нибудь указателю(указатель не этим определяется), а просто потому, что оно хранит адрес.  И последнее. Разыменование указателя, т.е. получение значения с адреса можно применить только к указателям. И если это можно проделать с именем массива, то почему его нельзя считать указателем? 
Опять же, это моё мнение. И я его высказываю, и пытаюсь объяснить свою точку зрения. В ответ же слышу только одно. Dov, ты не прав. Ну, допустим я не прав. Ну пусть тогда мне хоть один знаток стандарта объяснит, почему самолёты летают, а крыльями не машут. То есть, почему он пользуется именем массива, как указателем, когда разыменовывает его и получает доступ к значениям, а называть его указателем не хочет. Это я не про индексы говорю, а про звёздочки... 
Да, впрочем, ничего мне говорить не нужно.  Я уже вижу руки, тянущиеся к клавиатуре, что бы напечатать три слова. Dov, ты не прав.

Ладно, развлекайтесь тут без меня. Пойду лучше FiMa1`е помогу.
 
FiMa1, вариант Anikmar`а, тот что с индексами, очень хороший. Если есть проблемы с пониманием работы указателей, то лучше, с моей точки зрения, использовать его.  Но я так понимаю, что ты просто хочешь потренироваться  в использовании указателей. 

Цитата(Anikmar @  26.4.2007,  17:07 Найти цитируемый пост)
Остается поменять индексный доступ на указатели - и все есть
Это правильно. Так и нужно сделать. 
Вот тебе переделаный вариант Anikmar`а.
Код
int main(void)
{
    srand((unsigned)time(NULL));

    int str = 3, row = 5, tdim = 4;
    double ***a;
    int i, j, k;
    
    a = new double**[str];    

    for(i = 0; i < str; i++)
    { 
        *(a + i) = new double* [row];
        for(j = 0; j < row; j++)
            *(*(a + i) + j) = new double[tdim];
    } 
    
    for(i = 0; i < str; i++)
        for(j = 0; j < row; j++)
            for(k = 0; k < tdim; k++)
                *(*(*(a + i) + j) + k) = rand() % 100;
            
    for(i = 0; i < str; i++)
    {
        for(j = 0; j < row; j++)
        {
            for(k = 0; k < tdim; k++)
                cout << setw(4) << *(*(*(a + i) + j) + k);
            cout << endl;
        }
        cout << endl;
    }
            
    for(i = 0; i < str; i++)
    {
        for(j = 0; j < row; j++)
            delete [] *(*(a + i) + j);
        delete [] *(a + i);
    }
            
    delete[] a;
            
    return 0;
}
 

Цитата(Anikmar @  26.4.2007,  14:26 Найти цитируемый пост)
FiMa1, Имейте в видуВариант Ln78 только для массива, занимающего единый блок памяти (только для статики).

А что нам может помешать создать динамический массив?   smile Кстати, и печатать раза в два меньше прийдётся. И выделение/освобождение памяти попроще будет. 
Код
int main(void)
{
    srand((unsigned)time(NULL));
    int     str = 3, row = 5, tdim = 4;    
    double *a, val;

    a = new double[str * row * tdim]; 

    for( int i = 0; i < str; i++)
    {
        for(int j = 0; j < row; j++)
        {
            for(int k = 0; k < tdim; k++)
            {
                val = *(a + (i * row * tdim) + (j * tdim) + k) = rand() % 100;
                cout << setw(4) << val;
            }
            cout << endl;
        }
        cout << endl;
    } 
    delete[] a;

    return 0;
}


Так, вроде всё. Всем пока.  smile 



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Ln78
Дата 27.4.2007, 06:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



FiMa1 и все желающие, первую часть статьи (случай статического распределения памяти) написал, можешь посмотреть. 
Dov, сочувтвия по поводу машин. В своём опусе, по странному стечению обстоятельств, я упоминал и тебя, и гаишников. Надеюсь, что в аварии я всё-таки не виноват smile 

Присоединённый файл ( Кол-во скачиваний: 34 )
Присоединённый файл  Comment.rar 21,09 Kb
PM MAIL   Вверх
apook
Дата 27.4.2007, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Во бл.. поэия!  Ln78 Не ожидал от тебя такого. еще бы в стихотворной форме че полинился? А вообще наверно познавательно но длинно, я устал читать.



--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Anikmar
Дата 27.4.2007, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Dov @  27.4.2007,  03:32 Найти цитируемый пост)
Цитата(Anikmar @  26.4.2007,  14:26 )
FiMa1, Имейте в видуВариант Ln78 только для массива, занимающего единый блок памяти (только для статики).


А что нам может помешать создать динамический массив?    Кстати, и печатать раза в два меньше прийдётся. И выделение/освобождение памяти попроще будет. 


Я имел в виду ограниченность применения приведенного примера в том, что там априоре предполагается размещение массива в едином блоке памяти:

Цитата(Ln78 @  26.4.2007,  13:50 Найти цитируемый пост)
 
      int A[N1][N2][N3];
      int *p = (int *)A;
      int i=1,j=2,k=3;
      A[i][j][k]=123;
      p[(i*N1+j)*N2+k]=321;


Примененный метод адресации по сути использует только указатель на базовый адрес: p[(i*N1+j)*N2+k]=321;,  при универсальной работе - нужно применять разименование: *(*(*(a + i) + j) + k)

Вот поэтому, я и написал, что вариант Ln78 будет работать, если массив объявлен статически либо единым блоком памяти (в последнем случае нельзя будет применить скобки, а только метод вычисления смещения)

В приведенном вами последнем варианте вы выделили под трехмерный массив один большой блок памяти, тем самым закрыв себе возможность доступа к массиву стандартными средствами языка - через индексы. Поэтому вы естественно будете вынуждены считать смещение самостоятельно.
Я не проверял, но почему-то уверен, что такой подход гораздо медленнее чем стандартный через квадратные скобки.

Мне кажется, путаница в данной теме возникла именно из-за того, что многие уверены, что массив должен занимать единый блок памяти и его адрес является адресом первого элемента массива. Во многих случаях это так, но единого блока памяти может и не быть, поэтому вычисление смещения элемента путем прибавления какого-то числа к базовому адресу заведомо ошибочно и работает только в ограниченных случаях.
Разыменование вида *(*(*(a + i) + j) + k) работает при любом способе объявления и организации массива - и статического (когда это действительно один большой блок памяти) и динамического - когда подмасивы могут находится где угодно.
PM MAIL ICQ   Вверх
apook
Дата 27.4.2007, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

массив должен занимать единый блок памяти

Цитата

Во многих случаях это так, но единого блока памяти может и не быть,

Статический массив (если он полностью статический) всегда будет занимать единый блок помяти...


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Anikmar
Дата 27.4.2007, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(apook @  27.4.2007,  09:38 Найти цитируемый пост)
Статический массив (если он полностью статический) всегда будет занимать единый блок помяти... 


А я как сказал? Именно это я и подразумевал как само собой разумеющееся:

Цитата(Anikmar @  27.4.2007,  09:17 Найти цитируемый пост)
если массив объявлен статически либо единым блоком памяти 


Хотя конечно это на сегодняшний день это так, может появится какой-нить чудо-компилятор, который и статические массивы будет распихивать по дыркам в памяти - кто знает.  smile  
Интересно, а если я объявлю достаточно громадный статический массив, для которого будет нехватать единого блока памяти. Программа не запустится? Или линкер ругнется? Лень проверять.
PM MAIL ICQ   Вверх
Fazil6
Дата 27.4.2007, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Dov @  27.4.2007,  03:32 Найти цитируемый пост)
Да пойми ты, наконец, что имя массива и его адрес это совершенно разные вещи.

и где я сказал, что это одно и тоже? Это ты сказал?
Цитата(Dov @  24.4.2007,  23:43 Найти цитируемый пост)

int p[3][3];
int** pAr = p;
Ты хоть понимаешь, что ты здесь написал. Ты пытаешься указателю на указатель на инт присвоить адрес двумерного массива

хотя до этого утверждал, что  имя двумерного массива это указатель на указатель, т.е. int** и вдруг оно уже int***. p это имя двумерного массива. 

Цитата(Dov @  27.4.2007,  03:32 Найти цитируемый пост)
И последнее. Разыменование указателя, т.е. получение значения с адреса можно применить только к указателям. И если это можно проделать с именем массива, то почему его нельзя считать указателем?

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

int a = **p;

то из этого можно сделать вывод, что p это int**. Первое разыменовывание возвращает int[3] , а второе int. 
ты ведь не станешь утверждать, что здесь
Код

class A 
{
public:
    operator int(){return x;}
private:
    const static int x = 100;
};

int main()
{
    A a;
    A *pa = &a;
        A **ppa = &pa;

    int x = *pa;
         int y = **ppa;
    std::cout << x << "    " << y;
return 0;
}

pa это int* или ppa - это int**... Или pa это int* ?

вот тебе пример

Код

void f(int *m)
{
    std::cout << "f output " << *m << "\n" ;
}

void pf(int **m)
{
    std::cout << "pf output " << **m << "\n" ;
}


int x[2] = {1,2};
int *px = x;  // вполне законно. x используется как int* 
                   // и совсем не как указатель на массив и , опятьже по твоему, грубо говоря int**

// и вот это работает
std::cout << px[0] << "\n";
// и вот это
std::cout << px[1] << "\n";
// и даже вот так
std::cout << *(px + 1) << "==" << x[1] << "==" <<  *(x + 1) << "\n";
// и даже в функцию можно передать
f(x);
// везде где нужно x используется как int*


// и всю эту аналогию ты переносишь на многомерные масивы
int y[2][2] = {{3,4}, {5,6}};
// y - это имя двумерного массива интов, и по твоему имеет тип int**

int **py = y // почему нельзя сделать так? одному int** присвоить значение другого int**
// почему это прокатывало с одномерным массивом? 

//почему y(имя двумерного массива, по твоему типа int**) нельзя передать 
//в функцию принимающую int** ???
pf(y); 

// y - можно использовать как указатель и с этим никто не спорит, но не как указатель на указатель на int

// я заметил, что ты очень любишь приведение типа 
std::cout << **((int **)y);  
// здесь говорится что y(имя массива) должен использоваться как int** хотя он и так по твоему типа int**
// и приведение вообще лишнее и ничего не должно менять. 
// но имеем чпок!!!

//Был правда разговор, что y это вообще int***,
// но эту чушь не фурычит аналогично


// Вопрос : почему такие проблемы с y(использованием как указатель на указатель на int)
// Ответ : потому, что y(имя массива) не int**




с удовольствием ознакомлюсь с примером использования двумерного массива или его имени в качестве int**. Вполне сойдет ссылка на приводимые ранее примеры или свежачек какой-нить...


Цитата(Dov @  27.4.2007,  03:32 Найти цитируемый пост)
Имя массива не потому указатель, что его можно или нельзя присвоить какому-нибудь указателю(указатель не этим определяется), а просто потому, что оно хранит адрес.
повторяю, никто не говорит, что это не указатель, все говорят тебе, что ты совершенно неправильно понимаешь на что этот указатель указывает, причем с наездами непонимаешь. 
Имя двумерного массива содержит адрес инта, до значения которого можно добраться [0][0].   Т.е. по адресу, который асоциирован с именем двумерного массива лежит int. Так почему бы на основании этого не сделать вывод, что имя двумерного массива является типом int* ??? Много всякой чепухи можно напридумывать....

Это сообщение отредактировал(а) Fazil6 - 27.4.2007, 10:15
PM MAIL   Вверх
FiMa1
Дата 27.4.2007, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Ln78 @ 27.4.2007,  06:24)
FiMa1 и все желающие, первую часть статьи (случай статического распределения памяти) написал, можешь посмотреть.

Зачотная статья, имхо! Молодец! Остаток статьи, после "Он говорит про себя «Ужо тебе, озорник»" дочитывал ПАДСТАЛОМ... Небольшая очепятка на 2-й странице "И тип int, мы договорились считать тоже 4-х битным". В целом все написано доходчивым языком.
Обязательно буду ждать серии второй.
PM   Вверх
Anikmar
Дата 27.4.2007, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Fazil6 @  27.4.2007,  10:09 Найти цитируемый пост)
с удовольствием ознакомлюсь с примером использования двумерного массива или его имени в качестве int**. Вполне сойдет ссылка на приводимые ранее примеры или свежачек какой-нить...


Для краткости: говорим о двухмерных массивах.

Это нельзя. Имя массива, хоть и приводится спокойно к **, но дальше компилятор ничего не знает о размерности массива.
Когда компилятор встречает конструкцию вида:
Код

int **p;
p[1][2] = 15;

То он подразумевает, что в p[1] находится указатель на массив интов. В соответствии с этим, если мы напишем конструкцию:
Код

int a[3][4];
int **P;

p = (int**)a;
p[1][2] = 15;


То работать так не будет. Так как присваивание только базового адреса массива, а в случае со статическим массивом - по сути адреса 1-го элемента не даст никакой информации об указателях на подмассивы.

Поэтому, для того, чтобы использовать двуойной указатель его необходимо проинициализировать конкретными значениями. А так, как эти конкретные значения знает только компилятор, в том блоке, в котором определен массив, то получится нечто подобное:
Код

void main(void )
{
    int a[3][4] = {{100,101,102,103},{110,111,112,113},{120,121,122,123}};
    int **pp;
    int i,j;

    pp = new int*[3];
    pp[0] = a[0];
    pp[1] = a[1];
    pp[2] = a[2];

/*
   После этого работаем с pp как будто это a
*/
    for (i=0;i<3;i++)
        {
            for(j=0;j<4;j++)
            {
                printf("%d\t",pp[i][j]);
                pp[i][j]*=2;
            }
            printf("\n");
        }
    printf("\n\n");
    for (i=0;i<3;i++)
        {
            for(j=0;j<4;j++) printf("%d\t",pp[i][j]);
            printf("\n");
        }

    getch();

}



Я только такой способ знаю статический массив привести к динамическому. Наверное есть и другие.
Конструкции вида *(p + RowCount*i+j) Я считаю медленными и громоздкими
PM MAIL ICQ   Вверх
JackYF
Дата 27.4.2007, 13:21 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(Dov @  27.4.2007,  03:32 Найти цитируемый пост)
что имя массива и его адрес это совершенно разные вещи

Ой... зря ты это написал. Была раньше темка, где обсуждалась косвенно эта проблема. Тему сейчас не буду искать, а предложу скомпилить следующий код:

Код

int p[10];
cout << p << '\n'; // имя массива
cout << &p; // его адрес


В обоих случаях буду выданы идентичные числа.

Жду возражений smile

Dov, ты не прав.


Цитата(Dov @  27.4.2007,  03:32 Найти цитируемый пост)
что бы напечатать три слова. Dov, ты не прав.

Да, кстати - здесь четыре слова smile



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
_stranger_
Дата 27.4.2007, 13:48 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 3.10.2006
Где: город-герой Киев

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



вот что говорит стандарт ISO/IEC14882 пункт 8.3.4.8
Цитата

[Example: consider
int x[3][5];
Here x is a 3×5 array of integers. When x appears in an expression, it is converted to a pointer to (the first of three) five-membered arrays of integers. In the expression x[i], which is equivalent to *(x+i), x is first converted to a pointer as described; then x+i is converted to the type of x, which involves multiplying i by the length of the object to which the pointer points, namely five integer objects. The results are added and indirection applied to yield an array (of five integers), which in turn is converted to a pointer to the first of the integers. If there is another subscript the same argument applies again; this time the result is an integer.
]

Dov ты все таки не прав...

Это сообщение отредактировал(а) _stranger_ - 27.4.2007, 13:50
PM MAIL   Вверх
Fazil6
Дата 27.4.2007, 13:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Anikmar @  27.4.2007,  12:51 Найти цитируемый пост)
Это нельзя. Имя массива, хоть и приводится спокойно к **

по вашему reinterpret_cast это спокойно приводится???  smile  С помощь этого Вы свой массив к чему угодно приведете

Код

class A
{
};

int a[3][4];

A *aa = reinterpret_cast<A*>(a);
A *aa = (A*)(a);
int *********** b = (int ***********)a;

// а как был int [3][4] так и остался



Цитата(Anikmar @  27.4.2007,  12:51 Найти цитируемый пост)
После этого работаем с pp как будто это a
 и что? вопрос в том как это использовать наоборот
Цитата

После этого работаем с a как будто это pp (т.е. int**)


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


Эксперт
****


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

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



Цитата(Fazil6 @  27.4.2007,  13:50 Найти цитируемый пост)
и что? вопрос в том как это использовать наоборот


В каком смысле? Запихать в него какие-то свои значения?
Я не понял слово "наоборот"


Цитата(Fazil6 @  27.4.2007,  13:50 Найти цитируемый пост)
по вашему reinterpret_cast это спокойно приводится???    С помощь этого Вы свой массив к чему угодно приведете


Си хорош тем, что можно что угодно привести к чему угодно. Правда будет ли это работать - это вопрос. Именно поэтому я и написал, что привести то спокойно можно, только дальнейшее использование невозможно. Или вы с этим не согласны?

Просто я так понял вопрос, что каким образом можно работать со статическим массивом как с двойным указателем. Я знаю только один способ и я его привел. Наоборот - я просто не понял, т.е. вы хотите использовать имя массива как двойной указатель? Т.е. какие действия вы хотите от него получить, чтобы такие же действия получать от двойного указателя?

Имеем объявление
int a[3][4];
int **p;

Соответственно:
Конструкция p[0] должна вернуть указатель на int
Конструкция a[0] также вернет указатель на int

Какие конкретно действия "наоборот" вас интересуют?


PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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