code:
#include <stdio.h>
typedef struct{
int a[10];
}TSArray;
int a[10],b[10];
TSArray c,d;
int main(int argc,char *argv){
d.a[0]=1;
c=d;//all ok
b[0]=1;
a=b;//error: incompatible types in assignment
return 0;
}
я вроде понимаю что такое и какая разница между lvalue & rvalue, также как и
modifiable lvalue && non-modifiable lvalue
я единственно не понимаю логики - какого х array non-modifiable lvalue ?
тогда как структура с array - modifiable lvalue.
Владимир Григорьев
"Cojocaru Sergiu" <alc...@gmail.com> wrote in message
news:eYGEs%23%237IH...@TK2MSFTNGP04.phx.gbl...
int * const a;
который инициализируете при объявлении адресом, который указывает на первый
элемент массива.
Если бы операция
a = b;
была бы допустима, то есть константному указателю 'а' можно было бы
присвоить в теле кода новое значение, то есть адрес памяти на которую
указывает константный указатель 'b', то мы бы получили утечку памяти. То
есть память, где размещается массив a[10], была бы утерена, так как ни одна
переменная на нее более не ссылается.
Но в принципе все это зависит от договоренностей авторов языка С: какой
использовать подход к определению массивов. Более того возвращаясь к
вышесказанному есть большая разница в передаче массива или структуры,
содержащей массив, в качестве аргумента функции.
При передаче массива в функцию передается лишь адрес массива, а не сам
массив вместе с элементами. При передачи струкутуры передается вся структура
целиком. Наверное именно потому, что авторы С не хотели передавать весь
массив целиком в качестве параметра, такая реализация появилась.
Чтобы проиллюстрировать все сказанное я приведу пример
char * const a[] =
{
"This",
"does",
"not",
"work!"
};
printf( "%s %s %s %s\n", a ); /* Неправильно!*/
struct B
{
char * const b[3];
} B = { "While" "this", "is", "work!" };
printf( "%s %s %s %s\n", B ); /* Правильно! */
Владимир Григорьев
"Vladimir Grigoriev" <vlad....@mail.ru> wrote in message
news:O8BRg989...@TK2MSFTNGP05.phx.gbl...
Например,
void f( char c[] )
{
c++; // ошибки нет!
std::cout << "c[] = " << c << std::endl;
}
int main()
{
char c[] = "ABCDEF";
//c++; ошибка!
f( c );
return 0;
}
Внутри main() объявлен массив символов 'c'. В этом случае 'c' - константный
указатель на область памяти, где расположен литерал "ABCDEF". При вызове
функции f() и передачи ей в качестве параметра массива 'c' создается
временный объект (копия 'c') - неконстантный указатель, которому
присваивается значение константного указателя 'c'. То есть переменная 'c'
передается по значению. Поэтому внутри f() мы можем изменять 'c'.
Владимир Григорьев
"SJA" <sja...@hotmail.com> wrote in message
news:g7ec5c$djq$1...@pandora.alkar.net...
> Можно, например, назначить ссылку на временный объект
Разумеется. Как и то, что назначивший её должен об этом
помнить и не пытаться её использовать, если не уверен,
что этот временный объект ещё существует.
Если же он [назначивший] постоянно это забывает (или
забивает на необходимость это помнить), то ему следует писать
на более строгих языках (а во втором случае - вообще не писать).
> Речь идет о другом.
И моя тоже. Я ведь специально отквотил именно так,
а не иначе, и написал, что таки да - можно "константному
указателю ... присвоить в теле кода новое значение"
> В-третьих, изначально авторами языка С
А я думал, мы про C++...
> если в качяестве параметра передается массив
Любопытно узнать IQ того программера,
который станет передавать массив по значению...
Это не субъективное понятие в программировании, а вполне объективное. Я вам
очень настоятельно рекомендую прочитать книги Скотта Майерса. А если вы их
уже читали, то еще раз их перечитать, так как вы очевидно совершенно не
понимаете, что такое плохой код в С++. В книгах Скотта Майерса приводится
много примеров плохого кода, как ОБЪЕКТИВНОГО понятия.
Владимир Григорьев