Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΎΠ΅ руководство ΠΏΠΎ C++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 15

Автор Π‘ΡŒΡΡ€Π½ Бтраустрап

struct S {

 S(int);

};


void foo(double a)

{

 S x(int(a)); // описаниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

 S y((int)a); // описаниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

 S z = int(a); // описаниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

}

R.8.2 Бмысл описатСлСй

Бписок описатСлСй слСдуСт послС (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ пустого) списка спСцификаций-описания (Β§R.7.1). ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒ содСрТит Π² точности ΠΎΠ΄Π½ΠΎ имя-ΠΈΠ·-описатСля, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π·Π°Π΄Π°Π΅Ρ‚ описываСмый ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€. Если Π½Π΅ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ описаний Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (Β§R.12.3, Β§R.13.4), имя-ΠΈΠ·-описатСля являСтся просто ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ. Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ auto, static, extern, register, friend, inline, virtual ΠΈΠ»ΠΈ typedef относятся нСпосрСдствСнно ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΈΠΌΠ΅Π½ΠΈ-ΠΈΠ·-описатСля ΠΈΠ· списка описатСлСй. Π’ΠΈΠΏ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ-ΠΈΠ·-описатСля опрСдСляСтся ΠΊΠ°ΠΊ спСцификациСй-описания (Β§R.7.1), Ρ‚Π°ΠΊ ΠΈ Π΅Π³ΠΎ описатСлСм.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, описаниС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄

T D

Π³Π΄Π΅ T ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ, Π° D - ΠΎΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒ. Если Π² описании D Π΅ΡΡ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π±Π΅Π· скобок, Ρ‚ΠΎ Ρ‚ΠΈΠΏ этого ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Π΅ΡΡ‚ΡŒ T.

Π’ описании, Π³Π΄Π΅ D ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄

( D1 )

Ρ‚ΠΈΠΏ D1 Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Ρ‚ΠΈΠΏ D. НаличиС скобок Π½Π΅ мСняСт Ρ‚ΠΈΠΏΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π² Π½ΠΈΡ… ΠΈΠΌΠ΅Π½ΠΈ-ΠΈΠ·-описатСля, Π½ΠΎ для слоТных описатСлСй ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° порядок примСнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.

R.8.2.1 Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ

Π’ описании T D, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ D ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄

* список-спСцификаций-cv opt D1

Ρ‚ΠΈΠΏ описываСмого ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Π΅ΡΡ‚ΡŒ

"… список-спСцификаций-cv ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° T". ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ список-спСцификаций-cv относится ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ, Π° Π½Π΅ ΠΊ ΡƒΠΊΠ°Π·ΡƒΠ΅ΠΌΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ.

НапримСр, Π² описаниях

const ci = 10, *pc = &ci, *const cpc = pc;

int i *p, *const cp = &i;

ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ: ci ΠΊΠ°ΠΊ константа Ρ†Π΅Π»ΠΎΠ΅; pc ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° константу Ρ†Π΅Π»ΠΎΠ΅; cpc ΠΊΠ°ΠΊ константа ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° константу Ρ†Π΅Π»ΠΎΠ΅; i ΠΊΠ°ΠΊ Ρ†Π΅Π»ΠΎΠ΅; p ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ†Π΅Π»ΠΎΠ΅; ΠΈ cp ΠΊΠ°ΠΊ константа ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ†Π΅Π»ΠΎΠ΅. ПослС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ значСния ci, cpc ΠΈ cp Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ pc ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ cp. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ допустимых ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ:

i = ci;

*cp = ci;

pc++;

pc = cpc;

pc = p;

НСдопустимы ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:

ci = 1; // ошибка

ci++; // ошибка

*pc = 2; // ошибка

cp = &ci; // ошибка

cpc++; // ошибка

p = pc; // ошибка

КаТдая ΠΈΠ· этих ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ нСдопустима ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° измСняСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, описанного со спСцификациСй const, ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ ΠΏΠΎΠ·Π΄Π½Π΅Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ указатСля, настроСнного Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±Π΅Π· спСцификации const.

Аналогична ситуация со спСцификациСй volatile.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ Β§R.5.17 ΠΈ Β§R.8.4.

НСльзя ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° ссылки (Β§R.8.2.2) ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ поля (Β§R.9.6).

R.8.2.2 Бсылки

Π’ описании T D, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ D ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄

& ΡΠΏΠΈΡΠΎΠΊ-спСцификаций-cv opt D1

Ρ‚ΠΈΠΏ описываСмого ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Π΅ΡΡ‚ΡŒ "…список-спСцификаций-cv ссылка Π½Π° T". Π’ΠΈΠΏ void& нСдопустим.

НапримСр, Π²ΠΎ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅

void f(double& a) { a += 3.14; }

//…

double d = 0;

f(d);

a описываСтся ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ ссылкой, поэтому Π²Ρ‹Π·ΠΎΠ² f(d) ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΡŽ d Π½Π° 3.14. Π’ΠΎ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅

int v[20];

//…

int& g(int i) { return v[i]; }

//…

g(3) = 7;

описываСтся: функция g() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ссылку Π½Π° Ρ†Π΅Π»ΠΎΠ΅; поэтому ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ g() = 7; присвоит 7 Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠΌΡƒ элСмСнту массива v. Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚:

struct link {

 link* next;

};

link* first;


void h(link*& p) // `p' ссылка Π½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ

{

 p-β€Ίnext = first;

 first = p;

 p = 0;

}


void k()

{

 link* q = new link;

 h(q);

}

Π—Π΄Π΅ΡΡŒ p описано ΠΊΠ°ΠΊ ссылка Π½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° link, поэтому Π²Ρ‹Π·ΠΎΠ² h(q) Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ q, Ρ€Π°Π²Π½ΠΎΠ΅ 0, см. Ρ‚Π°ΠΊΠΆΠ΅ Β§R.8.4.3.

НСдопустимы ссылки Π½Π° ссылки, ссылки Π½Π° Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ поля (Β§R.9.6), массивы ссылок ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° ссылки. ОписаниС ссылки Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ (Β§R.8.4.3), Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚Π΅Ρ… случаСв, ΠΊΠΎΠ³Π΄Π° описаниС содСрТит ΡΠ²Π½ΡƒΡŽ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ extern (Β§R.7.1.1), ΠΈΠ»ΠΈ являСтся описаниСм Ρ‡Π»Π΅Π½Π° класса (Β§R.9.2) ΠΏΡ€ΠΈ описании самого класса, ΠΈΠ»ΠΈ являСтся описаниСм ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° (Β§R.8.2.5), см. Ρ‚Π°ΠΊΠΆΠ΅ Β§R.3.1.

R.8.2.3 Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Ρ‡Π»Π΅Π½Ρ‹

Π’ описании T D, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ D ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄

ΠΏΠΎΠ»Π½ΠΎΠ΅-имя-класса :: * список-спСцификаций-cv opt D1

Ρ‚ΠΈΠΏ описываСмого ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Π΅ΡΡ‚ΡŒ "… список-спСцификаций-cv ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‡Π»Π΅Π½ класса ΠΏΠΎΠ»Π½ΠΎΠ΅-имя-класса Ρ‚ΠΈΠΏΠ° T".

НапримСр, Π²ΠΎ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅

class X {

public:

 void f(int);

 int a;

};


int X::* pmi = &X::a;

void (X::* pmf)(int) = &X::f;

pmi ΠΈ pmf ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‡Π»Π΅Π½ X Ρ‚ΠΈΠΏΠ° T ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‡Π»Π΅Π½ X Ρ‚ΠΈΠΏΠ° void(int) соотвСтствСнно. Π­Ρ‚ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

X obj;

//…

obj.*pmi = 7; // ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ 7 Ρ‡Π»Π΅Π½Ρƒ obj Ρ‚ΠΈΠΏΠ° int

(obj.*pmf)(7); // Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½ obj

 // с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ 7

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‡Π»Π΅Π½ нСльзя Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π½Π° статичСский Ρ‡Π»Π΅Π½ класса (Β§R.9.4), см. Ρ‚Π°ΠΊΠΆΠ΅ Β§R.5.5 ΠΈ Β§R.5.3.

R.8.2.4 ΠœΠ°ΡΡΠΈΠ²Ρ‹

Π’ описании T D, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ D ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄

D1 [ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅-константа opt ]

описываСтся ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ‚ΠΈΠΏΠ° "… массив T". Если Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅-константа присутствуСт (Β§R.5.19), Ρ‚ΠΎ ΠΎΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ цСлочислСнный Ρ‚ΠΈΠΏ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, большСС 0. Π­Ρ‚ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Π΅Ρ‚ число элСмСнтов массива. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ выраТСния-константы Π΅ΡΡ‚ΡŒ N, Ρ‚ΠΎ массив ΠΈΠΌΠ΅Π΅Ρ‚ N элСмСнтов с индСксами ΠΎΡ‚ 0 Π΄ΠΎ N-1.

Массив ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΠ·: ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· основных Ρ‚ΠΈΠΏΠΎΠ² (Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ void), указатСля, указатСля Π½Π° Ρ‡Π»Π΅Π½Ρ‹, класса, пСрСчислСния ΠΈΠ»ΠΈ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ массива.

Если подряд ΠΈΠ΄ΡƒΡ‚ нСсколько спСцификаций "массив…", образуСтся ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅-константа, Π·Π°Π΄Π°ΡŽΡ‰Π΅Π΅ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ массива, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ массива. Π’Π°ΠΊΠΎΠ΅ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π² случаС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚ΠΈΠΏΠ° массив, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠΎΠ³Π΄Π° массив являСтся внСшним, Π° Π΅Π³ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ связано Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ памяти, находится Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ мСстС. ΠŸΠ΅Ρ€Π²ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅-константа ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½ΠΎ ΠΈ Π² Ρ‚ΠΎΠΌ случаС, Ссли Π·Π° описатСлСм слСдуСт список-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² (Β§R.8.4). Π’ΠΎΠ³Π΄Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ массива опрСдСляСтся числом элСмСнтов, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π΅ (Β§R.8.4.1).

Π’ описании

float fa[17], *afp[17];

описаны массив чисСл Ρ‚ΠΈΠΏΠ° float ΠΈ массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° числа Ρ‚ΠΈΠΏΠ° float, Π° Π² описании

static int x3d[3][5][7];

описан статичСский Ρ‚Ρ€Π΅Ρ…ΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив Ρ†Π΅Π»Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€Π° 3Γ—5Γ—7. Π‘Ρ‚Ρ€ΠΎΠ³ΠΎ говоря, x3d являСтся массивом ΠΈΠ· Ρ‚Ρ€Π΅Ρ… элСмСнтов, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ массив ΠΈΠ· пяти массивов, Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· послСдних являСтся массивом ΠΈΠ· сСми Ρ†Π΅Π»Ρ‹Ρ…. Π’ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ допустимо появлСниС любого ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ: x3d, x3d[i], x3d[i][j], x3d[i][j][k].

Если Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ участвуСт ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ‚ΠΈΠΏΠ° массив, Ρ‚ΠΎ, ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ случаи ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π° Π² опСрациях sizeof ΠΈΠ»ΠΈ& ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° для ссылки (Β§R.8.4.3), Π΅Π³ΠΎ Ρ‚ΠΈΠΏ прСобразуСтся Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт массива. НСсмотря Π½Π° это ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅, массивы Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ измСняСмыми адрСсами. Если Π½Π΅ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ случай использования массива ΠΏΡ€ΠΈ описании класса (Β§R.13.4.5), опСрация индСксации опрСдСляСтся Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ E1[E2] совпадаСт с *((E1) + (E2)). Π‘ ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ ΠΏΡ€Π°Π²ΠΈΠ» прСобразования Ρ‚ΠΈΠΏΠΎΠ² для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ +, Ссли E1 Π΅ΡΡ‚ΡŒ массив, Π° E2 Ρ†Π΅Π»ΠΎΠ΅, Ρ‚ΠΎ E1[E2] ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° E2-элСмСнт ΠΈΠ· E1. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, нСсмотря Π½Π° свой асимСтричный Π²ΠΈΠ΄, индСксация - коммутативная опСрация.

АналогичноС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ дСйствуСт ΠΈ для ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹Ρ… массивов. Если E - n-ΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ixjx…xk, Ρ‚ΠΎ Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ ΠΎΠ½ прСобразуСтся Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° (n-1)-ΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив Ρ€Π°Π·ΠΌΠ΅Ρ€Π° jx…xk. Если ΠΊ этому ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ явно ΠΈΠ»ΠΈ нСявно Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ индСксации примСняСтся опСрация *, ΡƒΠΊΠ°Π·ΡƒΠ΅ΠΌΡ‹ΠΉ (n-1)-ΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив сам Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ прСобразуСтся Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ.

НапримСр, рассмотрим описаниС

int x[3][5];

Π—Π΄Π΅ΡΡŒ описан массив ΠΈΠ· 3Γ—5 Ρ†Π΅Π»Ρ‹Ρ…. Если Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ появляСтся x, Ρ‚ΠΎ ΠΎΠ½ΠΎ прСобразуСтся Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ массив ΠΈΠ· пяти Ρ†Π΅Π»Ρ‹Ρ…. Если Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ появляСтся x[i], Ρ‡Ρ‚ΠΎ эквивалСнтно *(x+i), Π² Π½Π°Ρ‡Π°Π»Π΅ x прСобразуСтся Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΠΊΠ°ΠΊ Π±Ρ‹Π»ΠΎ сказано Π²Ρ‹ΡˆΠ΅, Π·Π°Ρ‚Π΅ΠΌ x+i прСобразуСтся ΠΊ Ρ‚ΠΈΠΏΡƒ x, для Ρ‡Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ i ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ x, Ρ‚.Π΅. Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ пяти Ρ†Π΅Π»Ρ‹Ρ…. Π—Π°Ρ‚Π΅ΠΌ происходит слоТСниС ΠΈ примСняСтся ΠΊΠΎΡΠ²Π΅Π½Π½ΠΎΡΡ‚ΡŒ, послС Ρ‡Π΅Π³ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ массив (ΠΈΠ· пяти Ρ†Π΅Π»Ρ‹Ρ…), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ прСобразуСтся Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΠΈΠ· Ρ†Π΅Π»Ρ‹Ρ…. Если Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° индСксация, процСсс повторяСтся, ΠΈ Π½Π° этот Ρ€Π°Π· ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ†Π΅Π»ΠΎΠ΅.

Из всСго этого слСдуСт, Ρ‡Ρ‚ΠΎ массивы Π² C++ хранятся ΠΏΠΎ строкам (послСдний индСкс измСняСтся быстрСС всСго), Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ индСкса ΠΈΠ· описания позволяСт Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ памяти, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΉ для массива, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΡ€ΠΈ вычислСнии индСксного выраТСния ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ индСкс Ρ€ΠΎΠ»ΠΈ Π½Π΅ ΠΈΠ³Ρ€Π°Π΅Ρ‚.