LINUX.ORG.RU

с++

 


0

1

не могу понять... нужна помощь. вобщем почему так нельзя?

#

int main(){
int array[2]{1, 3};
int array1[2]{2, 6};
int *p;
p=array; // array-это указатель на область памяти в которой может хранится первый элемент массива.
я его помещаю в указатель "p"

array=array1; 
array1=p; //тут обмениваю значениями два указателя , через третий.
посути теперь должно бы быть так:
for(int i=0; i<2; i++){
std::cout << array[i]// выведет 2 6
std::cout << array1[i]// выведет 1 3 
return 0;
}


#c

почему будет ошибка. почему так нельзя?


Последнее исправление: linuxpc (всего исправлений: 3)
Ответ на: комментарий от linuxpc

есть такая штука - переопределение операторов - вот она и происходит в равно и скобках

Silerus ★★★★
()
Ответ на: комментарий от anonymous

Ему уже столько раз объяснили, а он уже съехал на другую тему про std::string. Похоже он просто троллит нас потихоньку :-)

Twissel ★★★★★
()
Ответ на: комментарий от linuxpc

У меня начинает создаваться впечатление, что ты ждёшь, пока тебе прям здесь перескажут как минимум учебник Страуструпа))0 При этом самостоятельно учить материал ты не собираешься, потому как материла тебе насыпали немало ужо.

Reineke
()
Ответ на: комментарий от BceM_IIpuBeT

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

linuxpc
() автор топика
Ответ на: комментарий от Twissel

нет, нет и нет. просто я прочитал ту ссылку, что Вы кинули и из примера что там был, вдруг появился этот вопрос. я решил не окладывать его

linuxpc
() автор топика
Ответ на: комментарий от linuxpc

std::string это класс C++, который хранит у себя внутри массив char в куче. Через перегруженный оператор [], он получает значение первого элемента в массиве.

neon1ks ★★
()
Последнее исправление: neon1ks (всего исправлений: 1)
Ответ на: комментарий от linuxpc

все просто «=» - это оператор который переопределяется как метод совсем в примитиве это будет выглядеть как то так

std::string operator =(const char &value){
return std::string(value);
}
Тоже самое с методом []
char std::string::operator [](const int &value){
return this->at(value);
}

Silerus ★★★★
()
Ответ на: комментарий от linuxpc

Если нет, тогда разберись с адресной арифметикой.

И по той ссылке, что я привёл нет и не может быть ни слова про класс string, т.к. это книга по Си, а не по C++

Twissel ★★★★★
()
Ответ на: комментарий от Twissel

ну вот в том то и дело... там было сказано про массив char и я подумал, а чем же они отличаются string и массив char

linuxpc
() автор топика
Ответ на: комментарий от LongLiveUbuntu

так это указатели, а не массивы. ещё и в стиле 70-х объявление, зачем ты старьё читал? в новых изданиях исправили много чего, старые ничему хорошему не научили бы.

anonymous
()
Ответ на: комментарий от linuxpc

пишут, что строка в с++ это массив символов

В общем случае - нет. Строка в C++ - это класс. Тот факт что у данного класса ИМЕЕТСЯ поддержка оператора[] не делает этот класс массивом - тут советую загуглить такое понятие как «оператор» и «перегрузка операторов»(что уже посоветовали выше).

Из string МОЖНО получить массив символов - метод c_str() в помощь.

я восспитан на просторах форума. тут мои учителя. а книг я не читал.

Настоятельно рекомендую прочесть хотя бы одну книгу по C++ - если вопрос темы еще понятен для новичка который не совсем освоился, то вот этот вопрос чётко показывает что ты даже не начал еще разбираться что к чему и не в курсе насчет базовых понятий. А без этого тебе сложно что-то разжевать без копипасты целых глав из учебников.

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 2)
Ответ на: комментарий от linuxpc

Почитай уже учебник по сям, как выше предлагали.

anonymous
()
Ответ на: комментарий от linuxpc

Лучше опереться на автора книги по си или си++, книгу с собой взять легче, чем человека с лора и в глазах препода автор книги, скорее всего, будет весомее.

Deleted
()
Ответ на: комментарий от no-such-file

Да? А когда передаёшь в функцию, то почему-то указатель...

Что, даже если передавать по ссылке?

Pinkbyte ★★★★★
()
Ответ на: комментарий от BceM_IIpuBeT

https://timsong-cpp.github.io/cppwp/n4659/over.oper#nt:operator

operator: one of

( )

anonymous
()
Ответ на: комментарий от no-such-file

Правильно чуть выше написали про передачу массива по ссылке.

Ещё дополню, если придерживаться CppCoreGuidelines, то проверяльщики этих правил будут ругаться на места где передаёшь массив в функцию, которая ожидает указатель, с ошибкой implicit array to pointer decay. Если действительно нужно передавать в какую-то функцию массив(пусть например a), то нужно передавать &a[0], тогда не будет ошибки CppCoreGuidelines, так как типа ты знаешь что делаешь, и нет implicit преобразования...

fsb4000 ★★★★★
()
Ответ на: комментарий от fsb4000

то нужно передавать &a[0]

Напридумывают же ерунды

annulen ★★★★★
()
Ответ на: комментарий от anonymous

Ну может быть...

Вот что я имел ввиду:

Вот правило: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Ri-array

Warn for any expression that would rely on implicit conversion of
an array type to a pointer type. Allow exception for 
zstring/czstring pointer types.

в чекере варнинг называется: «array to pointer decay» (да без слова implicit, анон ты прав)

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от Deleted

нет. по мнению преподавателей, учебники пишут невсегда умные люди.

linuxpc
() автор топика
Ответ на: комментарий от linuxpc

Ну если понял для начала расскажи нам, что такое указатель? ;-)

Все-таки прав Croco, когда без ясного понимания базовых понятий (в лучшем случае с Питоном за плечами) лезут сразу в Си++ вот такая каша и получается на выходе...

Twissel ★★★★★
()
Ответ на: комментарий от no-such-file

Все-таки указатель на первый элемент массива и сам массив это разные типы данных.

Когда нужно изменить элементы массива передаём указатель на него (на первый элемент).

Когда сам указатель на массив — ссылку на указатель. Вроде так :-)

Twissel ★★★★★
()
Последнее исправление: Twissel (всего исправлений: 1)
Ответ на: комментарий от Twissel

я бы хотел сказать ,что это переменная, которая содержит адрес. и тут тогда у меня вопрос к себе, что такое переменная. ну раз упомянали Ассемблер, то лучше взять от туда это понимание. переменная в Ассемблере, это то с помощью чего мы можем обращаться к адресу, в котором лежит значение чего либо не прописывая его явно в шестнадцатиричной системе счисления, а указывая его в виде удобного нам и понятного допустимого знака или слова. это как бы ссылка на этот адрес. тогда указатель типа int *p=&a; это ссылка на область памяти типа int в которой содержится адрес 'a'

linuxpc
() автор топика
Ответ на: комментарий от Twissel

ребята, пишите пожалуйста понятнее. что очевидно для Вас не очевидно для меня. указатель на массив. то есть это указатель на имя массива или указатель на указатель. int array[22]; array это указатель на первый элемент этого массива. int *array[22]; это тогда эквивалентно **array;

или что вы имели ввиду

linuxpc
() автор топика
Ответ на: комментарий от linuxpc

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

Адрес чего?

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

Для начала уясни, что переменная в программе на Си/Си++ это lvalue (леводопустимое выражение), т.е. это то, что стоит в левой части оператора присваивания в простейшем случае. Просто поименнованная область памяти в программе. В адреса пока не залазим.

В переменной содержится значение определенного типа. Плюс к этому она имеет адрес в памяти. Так вот, переменная типа указатель это переменная содержащая адрес переменной, а не ее значение. Чтобы получить значение переменной по адресу в указателе, этот указатель Нужно разыименовать оператором *.

Для начала просто пойми, что адрес переменной и ее значение (в ячейке по адресу) это два разных числа.

Twissel ★★★★★
()
Ответ на: комментарий от Twissel

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

ну как бы я понимаю так: адрес переменной , это адрес по которому находится значение, которое было присвоенно этой переменной. конечно же адрес и значение переменной это разные вещи. a=10; ox4567.... -это допустим адрес переменной 'a', по этому адресу в памяти хранится значение 10. как бы так вот я понял

linuxpc
() автор топика
Ответ на: комментарий от linuxpc

адрес переменной , это адрес по которому находится значение

Упрощенно говоря, это «номер» ячейки памяти программы.

Применительно к ОП, как тут уже все отписались, ты допустил 3 ошибки

  • С обоих сторон оператора присваивания у тебя lvalue;
  • Ты не выделяешь память;
  • В простейшем случае массивы одинакового размера копируются в цикле поэлементно.

На засыпку резюмирую тебе инфу, чтобы голове сложилась картинка. Есть сущность переменная. Эта «вещь» обладает такими свойствами как:

  • Имя (lvalue — леводопустимое значение);
  • Тип (множество значений, которое может принимать переменная и допустимых операций над ними);
  • Адрес (номер ячейки памяти, куда записывается переменная в момент выполнения программы);

Теперь, есть переменная специального типа T *xуказатель x на переменную типа T. Именно таким переменным и присваиваются адреса переменных некоторого типа в программе. Про указатель типа void* прочитаешь сам ;-)

Возвращаясь к ОП: В твоём случае указатель на первый элемент массива и собственно массив это совсем разные типы данных. Указатель это адрес первого элемента.

Массив это множество однотипных значений в памяти доступ к которым ты можешь получить через указатель, если освоишь адресную арифметику.

Так расписал, что даже сам уже понял :-D

Twissel ★★★★★
()
Последнее исправление: Twissel (всего исправлений: 2)
Ответ на: комментарий от Twissel

Возвращаясь к ОП: В твоём случае указатель на первый элемент массива и собственно массив это совсем разные типы данных. Указатель это адрес первого элемента.

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

вот и все

linuxpc
() автор топика
Ответ на: комментарий от linuxpc

Это константный указатель, «обёрнутый сахаром» который прикидывается, что он что-то более высокоуровневое.

anonymous
()
Ответ на: комментарий от anonymous

я просто только на этом форуме от ребят услышал,что такие указатели существуют... я не понимаю и не понимал их смысл.

linuxpc
() автор топика
Ответ на: комментарий от linuxpc

:-D

А зачем тогда вообще нужны указатели?

Почему без них нельзя обойтись? :-)

Twissel ★★★★★
()
Ответ на: комментарий от linuxpc

Ты опять понёс околесину, полный бред.

Почитай про простые и составные типы данных.

Не пиши бред про только тебе одному известные вещи «массив», «имя массива».

Все нужные для понимания определения я привел выше.

За то время, что мы тут тусуемся уже можно было K&R прочитать.

Из чего я делаю вывод, что либо ты далёк от программирования как я от Луны или ты бот, не обессудь)))

Twissel ★★★★★
()
Ответ на: комментарий от Twissel

наверное вы вскользь читаете мои сообщения или вообще не читаете. я говорил о константном указателе. о нем я услышал только тут.

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

и да, я далек от программирования

linuxpc
() автор топика
Ответ на: комментарий от linuxpc

так как указатель это переменная

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

Во-вторых, в Си есть указатель на константу (значение, которое нельзя изменить, а сам указатель можно, чтобы он указывал на другую ячейку памяти), например

int const* px

И есть константный указатель на целое (адрес на который указывает переменная нельзя изменить, значение по адресу — можно)

int *const py

Запутал? То-то же. Т.е. если тебе действительно интересна тема читай книги.

А для просто пофлудить в Сети есть другие ресурсы.

Twissel ★★★★★
()
Последнее исправление: Twissel (всего исправлений: 3)
Ответ на: комментарий от Twissel

тут кажется понял... а это чаго?

*int func(data, data);

int *func(data, data);

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

linuxpc
() автор топика
Ответ на: комментарий от Twissel

я думаю, что если забью в тот парсер свой бредовый код, то нам обоим станет стыдно: мне и парсеру

linuxpc
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.