Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lekcija-12.pdf
Скачиваний:
30
Добавлен:
10.02.2016
Размер:
367.6 Кб
Скачать

for (int i=0; i<n; i++) {cout << setw(8);

cout << Random_array[i];

if (!((i+1) %5)) cout << endl; //вывод элементов массива по 5 в строке

}

cout << endl; _getch(); return 0;

}

В этом случае элементы массива будут расположены четкими столбцами.

Массивы и указатели

Массивы и указатели тесно связаны. Имя массива является указателем-

константой на его первый (нулевой) элемент.

Запись имя_массива[индекс] – есть выражение с двумя операндами: имя_массива – константный указатель – адрес начала массива в памяти; индекс – определяет смещение от начала массива. Тогда действие бинарной операции [ ] можно объяснить так:

*(имя_массива + индекс).

int a [10];

 

//a – адрес массива (указатель-константа)

(a+i) == &a[i]

// (a+i) = (a + i *sizeof (int) );

*(a+i) == a[i];

//нельзя писать a++ или а--

 

 

// так как а – указатель-константа и его нельзя изменять

int *pa, ai;

 

//инициализация указателя pa адресом массива а

pa= &a[0];

 

pa=a;

 

// нельзя писать a=pa;

 

 

//так как а – указатель-константа и его нельзя изменять

(pa+1) == &a[1];

// и можно писать ра++ или pa--

(pa+i) == &a[i];

*(pa+i) == pa[i] *(pa+i) == a[i]; pa[i] == a[i];

ai= *pa;

ai

равно a[0];

Обратите внимание:

sizeof a равно 40, но sizeof pa равно 4 !!! (размер указателя)

Правило:

Имя массива и индексное выражение можно записать как ссылку и смещение и наоборот:

(a+i) есть &a[i] *(a+i) == a[i] ==i[a] !!!

имя массива == &имя массива == &имя массива[0]

Варианты обращения к элементам массива

int a[ ]={10, 20, 30, 40, 50, 60}; int main()

{

int i, *p;

//1

(i=0;

i<6;

i++)

 

for

6

Программирование – лекция 12 (лекции Стрикелевой Л.В.)

printf ("a[%d]=%d; %c", i, a[i], (i==2)? '\n': ' '); printf("\n\n");

//2

for (p=&a[0]; p<=&a[5]; p++)

printf (" *p: %d; %c", *p, ((p==&a[2])? '\n': ' ')); printf("\n\n");

for (p=a+5;

p>=a;

p--)

 

 

 

 

printf (" *p: %d; %c", *p, (p==a+3)? '\n': ' ');

 

printf("\n\n");

 

 

 

 

 

for (p=&a[0], i=0;

i<6;

i++)

 

 

 

printf (" *(p++): %d; %c", *(p++), (p==&a[2])? '\n': ' ');

 

 

 

 

//равносильно

*р++

printf("\n\n");

 

//Внимание!!! (*p)++

увеличивает значение a[i],

 

 

 

 

 

//3

p+i<=a+5;

i++)

// или

for (p=a, i=0; p+i<=a+5;

for (p=a, i=0;

p++)

 

 

%c", i, *(p+i), (i==2)? '\n': ' ');

printf ("*(p+%d) = %d\t

printf("\n\n");

 

 

 

 

 

//4

for (p=&a[0], i=0; i<6; i++)

printf ("p[%d] = %d; %c", i, p[i], (i==2)? '\n': ' '); printf("\n\n");

for (p=a+5, i=0; i<=5; i++)

printf ("p[-%d] = %d; %c", i, p[-i], (i==2)? '\n': ' '); printf("\n\n");

//5

for (p=a+5; p>=a; p--)

printf (" a[p-a]: %d; %c", a[p-a], (p==(a+3)) ? '\n': ' '); printf("\n\n");

_getch(); return 0;

}

Результаты вывода:

a[0]=10; a[1]=20; a[2]=30; a[3]=40; a[4]=50; a[5]=60;

*p: 10;

*p: 20;

*p: 30;

*p: 40;

*p: 50;

*p: 60;

*p: 60;

*p: 50;

*p: 40;

*p: 30;

*p: 20;

*p: 10;

*(p++):

10;

*(p++): 20;

 

*(p++): 30;

 

 

*(p++):

40;

*(p++): 50;

 

*(p++): 60;

 

 

*(p+0)

=

10

*(p+1)

=

20

*(p+2)

=

30

*(p+3)

=

40

*(p+4)

=

50

*(p+5)

=

60

p[0] = 10; p[1] = 20; p[2] = 30; p[3] = 40; p[4] = 50; p[5] = 60;

p[-0]

=

60;

p[-1]

= 50;

p[-2] = 40;

 

p[-3]

=

30;

p[-4]

= 20;

p[-5] = 10;

7

Программирование – лекция 12 (лекции Стрикелевой Л.В.)

a[p-a]: 60; a[p-a]: 50; a[p-a]: 40; a[p-a]: 30; a[p-a]: 20; a[p-a]: 10;

Примеры вывода элементов массива через указатель

1. Вывод элементов массива через указатель

int main()

{int intarray[] = { 31, 54, 77, 52, 93 }; int* ptrint;

ptrint = intarray; for(int j=0; j<5; j++)

cout << *(ptrint++) << endl;

//вывод значений массива через изменение указателя

_getch(); return 0;

}

Результат:

31

54

77

52

93

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

оператор: cout << *ptrint++ << endl; или: cout << *(ptrint +j) << endl;

2. А теперь в операторе вывода расставим скобки по-другому:

int main()

{int intarray[] = { 31, 54, 77, 52, 93 }; int* ptrint;

ptrint = intarray; for(int j=0; j<5; j++)

cout << (*ptrint)++ << endl;

//вывод измененного значения первого элемента

_getch(); return 0;

}

Результат будет иным:

31

32

33

34

35

3. Определить результат вывода***:

 

 

 

 

 

 

 

 

 

 

int a[ ]={0, 1, 2, 3, 4};

 

 

 

 

 

 

 

 

 

 

int *p[ ] = {a, a+1, a+2, a+3, a+4};

 

 

 

 

 

 

 

 

 

 

int **pp = p;

 

 

 

 

 

 

 

 

 

 

 

 

 

int main()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

{printf("%p

%d\n", a, *a);

 

 

 

 

 

//адрес а, 0

 

printf("%p

%p

%d\n", p, *p, **p);

// адрес p, адрес а,

0

printf("%p

%p

%d\n", pp, *pp, **pp);

// адрес p, адрес а,

0

 

 

pp

 

 

 

 

 

 

 

 

 

 

 

8

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Программирование – лекция 12 (лекции Стрикелевой Л.В.)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

a

0

1

 

2 3

 

4

 

 

 

 

 

 

 

 

 

pp++;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

printf("%d

%d

%d\n", pp-p, *pp-a, **pp);

 

 

 

 

 

 

// 1,

1,

 

1

 

 

 

 

 

 

pp

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

a

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

 

1

 

2

 

 

3

 

4

 

 

 

 

 

 

 

 

 

*pp++;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

printf("%d

%d

%d\n", pp-p, *pp-a, **pp);

 

 

 

 

 

 

// 2,

2,

 

2

 

 

 

 

 

 

pp

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

a

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

 

 

1

 

 

2

 

 

3 4

 

 

 

 

*++pp;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

printf("%d

%d

%d\n", pp-p, *pp-a, **pp);

 

 

 

 

 

 

// 3,

3,

 

3

 

 

 

 

 

 

pp

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

a

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

++*pp;

 

 

 

 

 

 

 

 

0

 

1

 

2

 

 

 

3

4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

printf("%d

%d

%d\n", pp-p, *pp-a, **pp);

 

 

 

 

 

 

// 3,

4,

 

4

 

 

 

 

pp p

a

0

1

2

3

4

pp=p; **pp++;

printf("%d %d %d\n", pp-p, *pp-a, **pp); // 1, 1, 1 pp

Программирование – лекция 12 (лекции Стрикелевой Л.В.)

 

 

9

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]