Указатель на член - элемент массива
Ты б хоть язык указал.
это что за аццкий с++ !?
До тех пор пока ты не ввел ни одной переменной типа S ты не можешь обращаться к ее(?) внутренностям. Это же самые начала ООП.
а чего ты хочешь добиться этим кодом? 

Получить указатель на член, который указывал бы на первый элемент массива этой структуры. Чтобы с его помощью в дальнейшем можно было для любого экземпляра этой структуры обращаться к первому элементу массива (S s; s.*ptr=17; )
мехмат?
Так что за язык-то? Только не говори, что это C, или, что C++, после таких фрагментов кода в это поверить очень сложно 

Если использовать то, что смещение начала массива в структуре совпадает (по значению, но не по типу) со смещением первого элемента массива, можно написать:
struct S {
int arr[8];
}
...
int S::* ptr = reinterpret_cast<int S::*>(&S::arr);
S s;
s.*ptr = 15;
std::cout << s.arr[0] << std::endl; // Выведет 15
...Но вообще-то это жесть 
struct S{что это за нах?
int arr[8];
}
...
int S::*ptr;
ptr=&S::arr[0];
...
Пиши русским языком!

struct S
{
int arr[8];
};
...
S test;
int *ptr;
ptr=&test.arr[0];
...
Нужно было несколько другое.
а что нужно было-то?
Чтобы [..] в дальнейшем можно было для любого экземпляра этой структуры обращаться к первому элементу массива (S s; s.*ptr=17;)
S s1, s2;И т.п.
s1.*ptr = 10; // == s1.arr[0]
s2.*ptr = 12; // == s2.arr[0]
ptr=&test.arr[0];Да ну вы все извращенцы.

В C имя массива само по себе является указателем на его первый элемент.
Ты, другими словами, хочешь создать алиас для элемента массива, где массив — это поле структуры. Но такого нельзя сделать даже для самого поля, не говоря уж об энном элементе массива. Можно взять физический адрес или указатель на член класса только для конкретного экземпляра.
Ты, другими словами, хочешь создать алиас для элемента массива, где массив — это поле структуры.Начнём с того, что хочу не я.
Но такого нельзя сделать даже для самого поля, не говоря уж об энном элементе массива.Для самого поля это сделать можно в С++ (получить и сохранить смещение поля внутри структуры). Попробуй скомпилировать код, который я привел, и разобраться в нём.
Можно взять физический адрес или указатель на член класса только для конкретного экземпляра.Ну вот, ты не знаешь, а говоришь. Плюсик тебе за распространение заведомо ложной информации.
при всём при этом код вполне себе работает 

Начнём с того, что хочу не я.извини, не туда пост приклеил.
Честно говоря, уже не помню, является ли допустимой по стандарту операция
p = S::*f;где f — поле структуры, или нужно делать через экземпляр. Но в любом случае, можно взять поинтер на сам массив, считая, что это и есть его нулевой элемент. Дальше — смещение на размер элемента (грязновато, конечно).
p = S::*f;вряд ли
но в вышеупомянутом коде такой операции нет
а пробовал вот так:
?
struct S{
int arr[8];
}
...
int S::*ptr;
ptr = S::arr;
...
?
reinterpret_cast<int S::*>как известно код с reinterpret_cast является заведомо не портируемым (корректным синтаксически, но некорректным функционально)
а это не будет работать - arr не static
а это не будет работать - arr не staticи что?
Где в коде намек на то, что он должен быть static?
По мнению многих сексопатологов указателем на член является мужской галстук.
что-что 
не скомпилируется

не скомпилируется
на gcc-4.1.1 не работает
все это очень хорошо иллюстрирует, что C++ - говно.
PS: Не стОит использовать тупые фичи (типа указателей на нестатические члены класса если сами авторы языка их еще до конца не продумали или авторы самых распространенных компиляторов не реализовали. Не надо добавлять на свою голову проблем.
все это очень хорошо иллюстрирует, что C++ - говно.
PS: Не стОит использовать тупые фичи (типа указателей на нестатические члены класса если сами авторы языка их еще до конца не продумали или авторы самых распространенных компиляторов не реализовали. Не надо добавлять на свою голову проблем.
не скомпилируетсязнаю
это впрочем вовсе не означает, что код неверный (как и код автора в первом посте хотя это может быть и так.
фигней страдаете.
раз в коде явно(статически) указан размер массива значит его надо и дальше везде указывать явно
int * arr и int arr[8] - это разные типы
раз в коде явно(статически) указан размер массива значит его надо и дальше везде указывать явно
int * arr и int arr[8] - это разные типы
struct S{
int arr[8];
int q;
};
typedef int (IntArray8)[8];
int main(array<System::String ^> ^args)
{
IntArray8 S::*ptr = &S::arr;
S obj;
obj.arr[0] = 5;
std::cout << (obj.*ptr)[0] << std::endl;
return 0;
}
>int * arr и int arr[8] - это разные типы
Но элемент-то массива - это int в любом случае. А нужно мне это вот для чего. В реальной задаче массив многомерные, а мне надо пройтись по набору таких структур и произвести операцию над определенными (везде одними и теми же) элементами массива. Хотелось бы сделать это наиболее красиво и эффективно. Обращение по нескольким индексам естественно медленнее, чем разыменовывание указателя на член, но я не смог записать получение указателя на член, являющийся элементом массива, и поинтересовался, возможно ли это вообще (здравый смысл подсказывает, что возможно, так же как указатель на int может указывать на элемент массива интов). И столкнулся с непониманием. reinterpret_cast и тому подобное нежелательны, т.к. концепция указателя на член, как я понимаю, и выступает альтернативой херне типа
#define OFFSET(STRUCT,FIELD) int &*(STRUCT*0.FIELD )
Но элемент-то массива - это int в любом случае. А нужно мне это вот для чего. В реальной задаче массив многомерные, а мне надо пройтись по набору таких структур и произвести операцию над определенными (везде одними и теми же) элементами массива. Хотелось бы сделать это наиболее красиво и эффективно. Обращение по нескольким индексам естественно медленнее, чем разыменовывание указателя на член, но я не смог записать получение указателя на член, являющийся элементом массива, и поинтересовался, возможно ли это вообще (здравый смысл подсказывает, что возможно, так же как указатель на int может указывать на элемент массива интов). И столкнулся с непониманием. reinterpret_cast и тому подобное нежелательны, т.к. концепция указателя на член, как я понимаю, и выступает альтернативой херне типа
#define OFFSET(STRUCT,FIELD) int &*(STRUCT*0.FIELD )
фактически ты хочешь получить смещение для подчасти внутренней структуры относительно внешней структуры.
т.е. фактически получается, что, например, для описания
ты хочешь получить смещение для p.y относительно S.
afaik, C++ в явном виде такое записывать не умеет.
т.е. фактически получается, что, например, для описания
struct Point
{
int x;
int y;
};
struct S{
int arr[8];
Point p;
};
ты хочешь получить смещение для p.y относительно S.
afaik, C++ в явном виде такое записывать не умеет.
Нет, я хочу получить смещение элемента массива относительно внешней структуры. В данном случае - смещение arr[0] относительно S. Но вообще похожие ситуации. А что значит в явном виде? Как ещё?
Как ещё?допустим так:
S s;
int offset = (char*)&s.arr[1] - (char*)&s;
И что потом с offset делать?
ты хочешь получить смещение для p.y относительно S.Можно так:
Point S::* Sptr = &S::p;
int Point::* Pptr = &Point::x;
Point p = {1, 2};
S d;
d.*Sptr.*Pptr = 10;
писать простую и интуитивно понятную конструкцию 

S ss[10];
for (int i = 0; i < 10; ++i)
*int*char*)&(ss[i] + offset = i;
> Можно так:
но в этом коде два смещения, соответственно которые каждый раз складываются.
хочется именно одно смещение для оптимизации производительности
но в этом коде два смещения, соответственно которые каждый раз складываются.
хочется именно одно смещение для оптимизации производительности
чем тебя дейфайны с тайп кастами не устраивают?
(char*)Тебя умные книжки еще не научили, что такое преобразование типа использовать в C++ крайне нежелательно (на его месте компилятор поставит static_cast, const_cast, reinterpret_cast - что первым подойдет из этой последовательности)?
ты пишешь не на C++, а на C для компилятора C++
эк ты его застыдил-то
интересно, а ты понимаешь почему это нежелательно?
или только пересказываешь умные книжки?
интересно, а ты понимаешь почему это нежелательно?
или только пересказываешь умные книжки?

уже из содержимого моего поста ясно, почему это нежелательно (хотя эту тему можно осветить подробнее, например изложить почему дальновидные программисты не используют const_cast и reinterpret_cast)
PS: не знаю как кто, а лично я книжки по языкам программирования читаю не для того, чтобы их зубрить и пересказывать, а чтобы вникать в логику соответствующего ЯП.
PS: не знаю как кто, а лично я книжки по языкам программирования читаю не для того, чтобы их зубрить и пересказывать, а чтобы вникать в логику соответствующего ЯП.
ах да, ты прав, уже из содержимого твоего поста видно что в "почему" ты не въехал, а просто зазубрил умную книжку 

дальновидные программисты не используют const_castИ почему же?
ах да, ты прав, уже из содержимого твоего поста видно что в "почему" ты не въехал, а просто зазубрил умную книжкубез аргументации это есть голословный наезд
И почему же?очевидно потому, что константный указатель может указывать на read only область памяти (стандарт и Страуструп это разрешают)
> Тебя умные книжки еще не научили
к сожалению, C/C++ - это не тот язык, "приколы" которого хочеться помнить...
к сожалению, C/C++ - это не тот язык, "приколы" которого хочеться помнить...
к сожалению, C/C++ - это не тот язык, "приколы" которого хочеться помнить...нет языка C/C++
есть язык C и язык C++ - два совершенно разных языка
соглашусь с утверждением, что C++ - не тот язык, приколы которого хочется помнить
но тем не менее если программируешь на каком-то языке, то его приколы помнить обычно необходимо (как минимум приколы той функциональности, которую непосредственно используешь).
> но тем не менее если программируешь на каком-то языке, то его приколы помнить обычно необходимо
мне можно не помнить
я уже на плюсах лет 5 не пишу.
мне можно не помнить
я уже на плюсах лет 5 не пишу.(на его месте может быть поставлено static_cast, const_cast, reinterpret_cast - что первым подойдет из этой последовательности)Слишком громоздко и из-за этого некрасиво.
если слишком громоздко и некрасиво, то можно не писать на C++(на его месте может быть поставлено static_cast, const_cast, reinterpret_cast - что первым подойдет из этой последовательности)Слишком громоздко и из-за этого некрасиво.

Я так понял требуется уточнение: цитата в скобках говорит НЕ о том, что программист может сделать (как я уже говорил const_cast, reinterpret_cast будут ставить только неумные программисты а о том, что компилятор будет делать, когда встретит C-шный синтаксис преобразования типа.
т.е. замечание в скобках следует читать так:
вместо (some_type)Val компилятор поставит static_cast<some_type>(Val const_cast<some_type>(Val reinterpret_cast<some_type>(Val) - что первым подойдет из этой последовательностии отсюда и очевидно почему C-шный синтаксис (some_type)Val не стОит использовать, а именно из за возможности пулучить const_cast или reinterpret_cast
Оставить комментарий
Dmitriy82
Ругается на последнюю строчку subscript requires array or pointer type.
Возможно ли, и если да то как правильно записать то, что я имел ввиду (указатель на первый элемент массива)?